This question already has answers here:
JavaScript regular expressions and sub-matches
(2个答案)
7年前关闭。
我正在尝试这场比赛
并得到:
当我期待的时候:
在删除全局标志之前,我没有运气,我认为这不会影响结果!
删除全局标志后,
产生:
这很酷,但是阅读文档我不知道:
为什么第一种形式不起作用 为什么全局标志会干扰与 匹配的如何在没有 的情况下获得预期的结果
在JavaScript Regex and Submatches上,最高答案是:
然而,
似乎能产生被俘虏的群体就好了。
谢谢你。
由于设置了
第二种情况:
未设置
至于的最后一个示例:
同样,由于设置了
如果使用不带
你会得到:
如果没有
(2个答案)
7年前关闭。
我正在尝试这场比赛
'/links/51f5382e7b7993e335000015'.match(/^\/links\/([0-9a-f]{24})$/g)
并得到:
['/links/51f5382e7b7993e335000015']
当我期待的时候:
['/links/51f5382e7b7993e335000015', '51f5382e7b7993e335000015']
在删除全局标志之前,我没有运气,我认为这不会影响结果!
删除全局标志后,
'/links/51f5382e7b7993e335000015'.match(/^\/links\/([0-9a-f]{24})$/)
产生:
[ '/links/51f5382e7b7993e335000015',
'51f5382e7b7993e335000015',
index: 0,
input: '/links/51f5382e7b7993e335000015' ]
这很酷,但是阅读文档我不知道:
()
index
和input
属性在JavaScript Regex and Submatches上,最高答案是:
然而,
> 'fofoofooofoooo'.match(/f(o+)/g)
["fo", "foo", "fooo", "foooo"]
似乎能产生被俘虏的群体就好了。
谢谢你。
最佳答案
从this msdn documentation中找到匹配方法:
强调我的。
因此,在您的第一种情况下:
'/links/51f5382e7b7993e335000015'.match(/^\/links\/([0-9a-f]{24})$/g)
由于设置了
/g
修饰符,它将仅返回已发生的完全匹配,而不返回子匹配。这就是为什么您只有一个包含单个元素的数组的原因。因为该正则表达式只有1个匹配项。第二种情况:
'/links/51f5382e7b7993e335000015'.match(/^\/links\/([0-9a-f]{24})$/)
未设置
/g
修饰符。因此,数组在0th
索引处包含完整匹配项。数组中的其他元素(第一个索引)是子匹配项-在这种情况下,是第一个捕获组。至于的最后一个示例:
'fofoofooofoooo'.match(/f(o+)/g)
同样,由于设置了
/g
修饰符,它将返回字符串中的所有匹配项,而不是子匹配项。因此,在字符串中,正则表达式f(o+)
匹配4次:fo - 1st complete match (sub-match 'o' in 1st captured group ignored)
foo - 2nd complete match (sub-match 'oo' ignored)
fooo - 3rd complete match (sub-match 'ooo' ignored)
foooo - 4th complete match (sub-match 'oooo' ignored)
如果使用不带
/g
修饰符的最后一个正则表达式,则将第一个匹配项的每个子匹配项作为单独的元素获取。尝试:'fofoofooofoooo'.match(/f(o+)/)
你会得到:
["fo", "o"] // With index and input element of course.
如果没有
/g
,它只会在第一个匹配项(fo
)之后停止,并返回整个匹配项和子匹配项。关于javascript - 当存在全局标志时,为什么String.match()不产生预期的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17912814/
10-09 22:40