【问题标题】:Repeat regex capturing group重复正则表达式捕获组
【发布时间】:2017-01-07 04:49:20
【问题描述】:

我正在尝试创建一个重复捕获两个不同捕获组的正则表达式。我的项目中有文本指针,例如 |:framework.urls.http:|我需要能够创建一个正则表达式来通过这些文本指针查找字符串中何时有 url。它们总是以 |:framework.urls 开头。something:|

它们可能针对其他文本指针,或者它们可能针对任何不是空格的字符,因为我们不允许文本中的 URL 中有任何空格。这是我尝试的解决方案的正则表达式:http://regexr.com/3e4pb

/(?:(\|:framework\.urls\.[^:]+:\|)+([^\s\|]*))+/g

在这个示例字符串上:

|:framework.urls.something:|/hey|:framework.urls.something-else:|.|:framework.urls.com:|/hey-不包括

我想要/期望的输出共有 8 个组...

  1. |:framework.urls.something:|
  2. /嘿
  3. |:framework.urls.something-else:|
  4. (无)
  5. |:framework.urls.after:|
  6. .
  7. |:framework.urls.com:|
  8. /嘿-那里

末尾的字符串(“不包含”)不会包含在正则表达式中。有没有简单的方法来实现这一点?我目前的实现似乎只抓住了最后两组(“|:framework.urls.com:|”和“/hey-there”)

【问题讨论】:

  • 如果您的模式只有 2 个组,您怎么能期望有 8 个组?你是说 8 场比赛吗?
  • @WiktorStribiżew 除以 | 和计数...
  • 我希望正则表达式末尾的 + 会重复分组,但情况可能并非如此
  • @user1771700:在任何正则表达式风格中都不会出现这种情况。那么,您需要 1-8 个值的列表吗?与| 拆分。
  • 用户,如果你把 plus 放在这里:)+)/ 比你有 3 个不错的组。

标签: javascript regex


【解决方案1】:

var str = '|:framework.urls.something:|/hey|:framework.urls.something-else:||:framework.urls.after:|.|:framework.urls.com:|/hey-there not included';

var re = /(\|:framework\.urls\.[^:]+:\|)([^\s|]+(?=\s|\|:))?/g; 
var m;

while ((m = re.exec(str)) !== null) {
  if (m.index === re.lastIndex) re.lastIndex++;
  console.log(m[1]);
  console.log(m[2]);
}

输出:

|:framework.urls.something:|
/嘿
|:framework.urls.something-else:|
未定义
|:framework.urls.after:|
.
|:framework.urls.com:|
/hey-there

https://regex101.com/r/zD8iZ0/3

vs 比较:

/(?:(\|:framework\.urls\.[^:]+:\|)+([^\s\|]*))+/g;             // OLD
   /(\|:framework\.urls\.[^:]+:\|)([^\s|]+(?=\s|\|:))?/g;      // NEW

我没有“重复”捕获组(除了使用global 标志),而是我对第二场比赛的规则更加严格,以寻找任何不是空格或|
而不是对“后跟空格或|:”使用积极的前瞻。

在我的例子中,返回 "(nothing)" 所需的字符串的“:||:”出现返回 undefined(希望这是您要查找的内容)

【讨论】:

    【解决方案2】:

    没必要这么复杂。
    您可以全局查找各个部分,放入数组中。

    (\|:(?:(?!:\||\s).)*:\||[\S\s]*?(?=\|:|$))

    展开

     (                             # (1 start)
          \|:
          (?:
               (?! :\| | \s )
               . 
          )*
          :\|
       |  
          [\S\s]*? 
          (?= \|: | $ )
     )                             # (1 end)
    

    【讨论】:

      【解决方案3】:

      你不需要最后的 +。它所做的只是让它变得贪婪并抓住一切,然后将最后一件事归还给你。基本上通过删除它就可以解决您的问题。

      更何况?:象征着非捕获组——http://www.regular-expressions.info/brackets.html

      您想要的示例:https://regex101.com/r/cR0aG8/8

      【讨论】:

        猜你喜欢
        • 2017-09-13
        • 2011-03-11
        • 2019-12-19
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        相关资源
        最近更新 更多