重复正则表达式捕获组

时间:2016-08-30 19:08:49

标签: javascript regex

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

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

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

这个示例字符串:

  

|:framework.urls.something:| / hey |:framework.urls.something-else:|。|:framework.urls.com:| /嘿 - 没有包含

我想要/期望的输出是8组......

  1. |:framework.urls.something:|
  2. /哎
  3. |:framework.urls.something-否则:|
  4. (无)
  5. |:framework.urls.after:|
  6. |:framework.urls.com:|
  7. /哎-有
  8. 末尾的字符串(“未包含”)不会包含在正则表达式中。有没有一种简单的方法来实现这一目标?我目前的实现似乎只是抓住了最后两组(“|:framework.urls.com:|”和“/ hey-there”)

3 个答案:

答案 0 :(得分:0)

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:|
  的 /哎-有信息

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

vs 用于比较:

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

我没有“重复”捕获组(旁边使用g lobal 标志)但是我已经使第二场比赛的规则更加严格,以寻找任何不是空格或|
并且使用了“后跟空格或|:”的正向前瞻。

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

答案 1 :(得分:0)

无需如此复杂 您可以全局查找单个部件,放入阵列。

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

扩展

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

答案 2 :(得分:0)

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

更不用说?:表示非捕获组 - http://www.regular-expressions.info/brackets.html

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