当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于正则的一个小问题?

谭嘉歆
2024-09-25

关于正则的一个小问题
/#\/((\w)+)/.exec("/a-web/#/abc?")
返回值是
 ['#/abc', 'abc', 'c', index: 7, input: '/a-web/#/abc?', groups: undefined]

数组第二项是匹配项(\w+) 返回 'abc'
数组的第三项 返回值 'c'怎么理解啊

没啥尝试

共有3个答案

习旻
2024-09-25

第一项是整个正则表达式所匹配到的文本

#\/((\w)+) -> #/abc

之后的每一项依次是正则表达式的分组

((\w)+) -> abc

(\w) -> c

仇高韵
2024-09-25

机器人回答的很机智,我只能点个赞了
image.png

那安宁
2024-09-25

在正则表达式中,当你使用括号(无论是捕获组还是非捕获组)时,它们会捕获匹配到的内容。在你的正则表达式 /#\/((\w)+)/ 中,存在两个层次的括号:

  1. 外层括号 ((\w)+):这是一个捕获组,它捕获整个 \w+ 匹配到的内容。\w+ 匹配一个或多个单词字符(字母、数字或下划线)。
  2. 内层括号 (\w):虽然这个括号在技术上是一个捕获组,但由于它紧跟在 + 量化符之后,它的行为可能与你预期的不同。在正则表达式中,+ 量化符作用于其前面的元素(这里是 \w),意味着它会尝试匹配一个或多个 \w。然而,由于内层括号的存在,+ 实际上是在说“匹配一个或多个 \w,但每次只捕获最后一个 \w”。这是因为正则引擎在尝试匹配多个 \w 时,会不断更新这个内层捕获组的内容,直到 \w+ 匹配完成,此时内层捕获组只保留最后一次匹配的内容。

在你的例子中,/#\/((\w)+)/ 匹配字符串 "/a-web/#/abc?" 中的 #/abc 部分。

  • 外层捕获组 ((\w)+) 捕获了整个 abc,因为它匹配了 \w+(即一个或多个单词字符)。
  • 内层捕获组 (\w) 在匹配过程中不断更新其内容,但只保留最后一次匹配的内容,即 c

因此,当你使用 .exec() 方法时,返回的数组包含:

  • 第一个元素是整个匹配项 #/abc
  • 第二个元素是外层捕获组匹配的内容 abc
  • 第三个元素是内层捕获组匹配的内容 c,这是因为在 \w+ 匹配 abc 的过程中,内层捕获组只保留了最后一次匹配的内容。

如果你不希望出现这种情况,可以移除内层的括号,只保留外层的捕获组,即使用正则表达式 /#\/(\w+)/。这样,你就只会得到一个捕获组,它捕获整个 \w+ 匹配到的内容。

 类似资料:
  • 上面是代码,想执行'person1.func3()'。 结果如下图

  • 我想匹配一段字符串中所有的input 并使用replace进行替换,如果input里面有类似data-* 这种自定义属性的就跳过 不知道这种正则该怎么写,我也阅读了文档并使用google。都没找到 比如 <input type='text' /> 这种Input就匹配,<input data-xxx /> 带有自定义属性的input 正则则不匹配

  • 怎么在a函数里面 返回 list-1/2/ 。 注意: 不能写死 list , 因为 $reg 其实也是一个变量(正则表达式)。 后期可能改成 cate 就是返回 cate-1/2/ 改成 category 就是返回 category-1/2/

  • 当前情况暂且可以满足: 但若: 头)被截断了。如何修改呢? 字符串的格式:\d+\.(我希望这里是任意字符,但也可以削减范围)+ * 然后重复。

  • 背景:基于Element UI 开发的项目,使用到了Tree树型控件 需求:页面有一个tree控件(可选择)如图 这个控件在切换月份的时候可能存在二级节点下有新增的节点或者减少的节点, 如果 ‘一级2’被全部中了,那么切换其他月份如果 ‘一级2’节点下有新增的节点也要勾选上。 树的深度不确定(后端返的),数据量大的时候遍历判断会影响性能,求问各位大佬 有什么比较好的办法处理吗 找出两颗树的差异的节

  • 一个学习案例中遇到的问题 index.html index.css index.js 上述代码中, 我在循环里为每个 .box 添加点击事件, 但是在事件里的i始终是循环体执行完毕后的结果 3, 为什么会出现这种情况? 因为之前写代码在 onclick 事件里基本都是用 this, 或者用 let 来代替 var 来定义变量, 所以绕过了这个坑 但现在遇到了这样的 bug, 还是想问下导致这个问题