【问题标题】:Regex non capturing groups in javascriptjavascript中的正则表达式非捕获组
【发布时间】:2011-09-21 19:48:22
【问题描述】:

我的正则表达式和 JavaScript 有点生疏了。我有以下字符串变量:

var subject = "javascript:loadNewsItemWithIndex(5, null);";

我想使用正则表达式提取5。这是我的正则表达式:

/(?:loadNewsItemWithIndex\()[0-9]+/)

这样应用:

subject.match(/(?:loadNewsItemWithIndex\()[0-9]+/)

结果是:

loadNewsItemWithIndex(5

5 提取为单行的最简洁、最易读的方法是什么?是否可以通过从匹配中排除 loadNewsItemWithIndex( 而不是将 5 作为子组匹配来做到这一点?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    String.match 的返回值是一个匹配数组,因此您可以在数字部分加上括号,然后只检索特定的匹配索引(其中第一个匹配是整个匹配结果,后续条目用于每次捕获组):

    var subject = "javascript:loadNewsItemWithIndex(5, null);";
    var result = subject.match(/loadNewsItemWithIndex\(([0-9]+)/);
                                        //             ^      ^  added parens
    document.writeln(result[1]);
                      //    ^ retrieve second match (1 in 0-based indexing)
    

    示例代码:http://jsfiddle.net/LT62w/

    编辑:感谢@Alan 更正了非捕获匹配的工作原理。

    实际上,它运行良好。在 a 中匹配的文本 非捕获组仍然被消耗,与匹配的文本相同 任何群体之外。捕获组就像一个非捕获组 具有额外功能:除了分组之外,它还允许您 独立于整体匹配提取匹配的任何内容。

    【讨论】:

    • The non-capturing match apparently doesn't work properly. 我知道 javascript 中有一些奇怪的正则表达式行为,但我认为这个问题是我有点生疏了。
    • 实际上,它运行良好。在非捕获组内匹配的文本仍被使用,与在任何组外匹配的文本相同。捕获组就像一个具有额外功能的非捕获组:除了分组之外,它还允许您提取与整体匹配无关的任何匹配项。
    • ...结果数组上的索引匹配正则表达式“组”数字(从 1 开始)。
    【解决方案2】:

    我相信以下正则表达式应该适合你:

    loadNewsItemWithIndex\(([0-9]+).*$
    
    var test = new RegExp(/loadNewsItemWithIndex\(([0-9]+).*$/);
    test.exec('var subject = "javascript:loadNewsItemWithIndex(5, null);";');
    

    这个的分解是

    loadNewsItemWithIndex = exactly that
    
    \( = open parentheses 
    
    ([0-9]+) = Capture the number
    .* = Anything after that number
    
    $ = end of the line
    

    【讨论】:

    • 你是对的。我在脑子里想出来的时候添加了它,并且从未删除它。
    • .*$ 也是出于同样的原因
    【解决方案3】:

    这就足够了:

    <script>
    var subject = "javascript:loadNewsItemWithIndex(5, null);";
    number = subject.match(/[0-9]+/);
    alert(number);
    </script>
    

    【讨论】:

    • 提供上下文的最佳答案
    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2019-01-12
    相关资源
    最近更新 更多