【问题标题】:Javascript regex: dynamic capture groupJavascript 正则表达式:动态捕获组
【发布时间】:2015-07-15 08:25:45
【问题描述】:

我是第一次尝试围绕正则表达式进行思考。

对于字符串

I want you to MATCH THIS, you bastard regex, but also MATCH X THIS and yeah,
MATCH X X X THIS too.

基本上,一个起始模式、一个结束模式和中间的任意数量的模式。

所以我想要myregex.exec string 陆续返回

["MATCH", "THIS"]
["MATCH", "X", "THIS"]
["MATCH", "X", "X", "X", "THIS"]

我已经尝试过这种变体

/(MATCH)\s+(X)?\s+(THIS)/

但没有雪茄……

【问题讨论】:

  • 那么你想匹配所有以空格分隔的大写单词吗?
  • 这在stackoverflow.com/questions/5018487/… 中得到了部分回答 - 请参阅 Tim Picker 的评论。简短回答:在某些正则表达式中,您可以要求对同一组进行多次捕获。但不是在 javascript 中。
  • @yu_sha 啊,我明白了。谢谢!
  • 话虽如此-您可以将所有内容归为一组,然后拆分。

标签: javascript regex capture-group


【解决方案1】:

可以使用正则表达式匹配整个表达式:

/MATCH\s+(?:X\s+)*THIS/g

要将其放入术语/单词数组中,您可以像这样使用String.split()

var out = document.getElementById( "out" );

function parse( string ){
  var re = /MATCH\s+(?:X\s+)*THIS/g;
  var matches = (string.match( re ) || [])
                  .map( function(m){ return m.split( /\s+/ ); } );
  out.innerHTML = JSON.stringify( matches );
}

parse( document.getElementById( "in" ).value );
textarea { width: 100%; }
<textarea id="in" onchange="parse( this.value )">I want you to MATCH THIS, you bad regex, but also MATCH X THIS and yeah, MATCH X X X THIS too.</textarea>
<p id="out"/>

【讨论】:

    【解决方案2】:

    尝试将\s+ 放入带有* 的可选组中:

    /(MATCH)\s+(?:(X)\s)*(THIS)/g
    

    注意g 修饰符以获取所有匹配项。

    【讨论】:

    • (?:(X)) 永远不会这样做。非捕获组中的捕获组......很奇怪。不适用于 MATCH X X X THIS,但显然在 JavaScript 中不起作用...
    • 将匹配多个Xs,但只会使用RegExp.exec()返回单个X作为捕获组 - 对于MATCH THIS,它将为@987654330返回一个空捕获组@s.
    猜你喜欢
    • 2016-02-10
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多