This question already has answers here:
JavaScript regular expressions and sub-matches

(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' ]

这很酷,但是阅读文档我不知道:
  • 为什么第一种形式不起作用
  • 为什么全局标志会干扰与
  • 匹配的()
  • 如何在没有indexinput属性
  • 的情况下获得预期的结果

    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