【问题标题】:Javascript Regex back-reference not populating all capturing groupsJavascript Regex 反向引用未填充所有捕获组
【发布时间】:2011-10-11 01:39:36
【问题描述】:

这里很奇怪(或者可能不是),我正在尝试通过 Javascript 正则表达式检索两个捕获组,第一组:一个或多个数字 (0-9),第二组:一个或多个单词字符或连字符(A-Z, 0-9, -) 但由于某种原因,我永远无法检索后一组。

请注意:我特意加入了替换 (|) 字符,因为我希望可能收到其中一个)

这是我正在使用的代码:

var subject = '#/34/test-data'
var myregexp = /#\/(\d+)|\/([\w-]+)/;
var match = myregexp.exec(subject);
if (match != null && match.length > 1) {
  console.log(match[1]); // returns '34' successfully
  console.log(match[2]); // undefined? should return 'test-data'
}

有趣的是,Regex Buddy 告诉我我确实有两个捕获组,并且实际上在测试短语中正确地突出显示了它们。

这是我的 JavaScript 语法中的问题吗?

【问题讨论】:

    标签: javascript regex capturing-group


    【解决方案1】:

    如果你改变:

    var myregexp = /#\/(\d+)|\/([\w-]+)/;
    

    | 替换元字符删除为:

    var myregexp = /#\/(\d+)\/([\w-]+)/;
    

    然后它将匹配两个组。目前,您的正则表达式正在寻找\d+[\w-]+,因此一旦它与第一组匹配,它就会停止,而第二组将为空。如果您删除|,它会查找\d+,然后是/,然后是[\w-]+,因此它始终会同时匹配或不匹配。

    编辑: 要匹配所有#/34/test-data#/test-data#/34,您可以改用#(?:\/(\d+))?\/([\w-]+)

    【讨论】:

    • 对不起,我应该提到,我想匹配 #/test-data#/34 这就是为什么会有交替字符,我该怎么做?
    • 哦,我想我只是有一个想法,我可以使用你的版本,但是将 + 更改为 * 以匹配 0 次或多次!
    • 太棒了,谢谢。效果很好。可能也比我的想法更好:)
    • 只是为了让您知道我在这方面有所进步,只是为了将捕获组保持在正确的索引位置。这就是我决定的:#(?:/(\d+))?(?:/([\w-]+))? 它将在第 1 组中保持#/34 的匹配,在第 2 组中保持#/test-data 的匹配,然后分别在第 1 组和第 2 组中。
    【解决方案2】:

    如果您删除“|”你得到了你想要的结果……这有帮助吗?

    var subject = '#/34/test-data'
    var myregexp = /#\/(\d+)\/([\w-]+)/;
    var match = myregexp.exec(subject);
    if (match != null && match.length > 1) {
      console.log(match[1]); // returns '34' successfully
      console.log(match[2]); // undefined? should return 'test-data'
    }
    

    编码愉快!

    编辑

    我认为您的问题是,由于您使用“|”,因此您告诉 JS 捕获第一组或第二组,并且由于 JS eval 是惰性的,当它找到第一组时,它就停止了那里...通过从 RegExp 中删除 OR 操作数,您可以获得两个结果...(类似于 AND)。

    【讨论】:

    • 请看我写给 mike 的回复,我确实需要 or 测试。
    • 嗨 Deleteman,我不得不接受 Mike 的回答,因为他满足了我的要求,我忘了提,我的错,但感谢您的努力!
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多