我正在尝试创建一个重复捕获两个不同捕获组的正则表达式。我的项目中有文本指针,如|: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组......
末尾的字符串(“未包含”)不会包含在正则表达式中。有没有一种简单的方法来实现这一目标?我目前的实现似乎只是抓住了最后两组(“|:framework.urls.com:|”和“/ hey-there”)
答案 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