使用正则表达式匹配连续的两个相同或不同的字符串。

4
我已经为PHP正则表达式函数编写了以下正则表达式:

\[\[.*?\]\]

这匹配双方括号之间的单词或短语。现在我想要找到一个正则表达式,可以匹配两个或更多连续的(相同或不同的)匹配项。我已经尝试过

(\[\[.*?\]\]){2,}

通过这个解决方法:正则表达式匹配连续重复单词。但是,它们都没有起作用。有没有更好的想法?

我的目标是匹配例如[one][two][three]。正则表达式的第一部分将匹配 [one],我正在尝试获取整个短语[one][two][three]

谢谢!


8
尝试使用正则表达式 (\[\[.*?\]\])\1+。请提供测试字符串和期望的输出,因为问题听起来有点不清楚。你所说的“相同或不匹配”是什么意思?以及为什么它没有起作用? - Wiktor Stribiżew
也许你需要([[.*?]])(?:\s*(?1))+?或者(?:\s*[[.*?]]){2,} - Wiktor Stribiżew
@WiktorStribiżew 我想匹配的是[one][two][three],正则表达式的第一部分将匹配[one],我正在尝试获取整个短语[one][two][three]。这样清楚吗?谢谢! - despinoUY
你的正则表达式有效,不是吗?如果你从两边都去掉一个括号。请参见([.*?]){2,}。或者更加优雅的写法:(?:[[^][]*]){2,}。或者你想捕获第一个[one]吗?那么使用([[^][]*])(?1)+。你需要什么样的输出结构?上述任何一种对你有用吗? - Wiktor Stribiżew
@WiktorStribiżew 我期望的输出是 [one][two][three]。抱歉我表达不够清楚!:( - despinoUY
1个回答

1
如果你从第二个模式的两侧都删除一个括号,它就可以工作了。请参见(\[.*?\]){2,}
一种更优雅的解决方案是(?:\[[^][]*]){2,}。这里,\[匹配[[^][]*将匹配除][之外的零个或多个字符,并且[]将匹配一个闭合的文字]
如果你想将第一个[one]捕获到第1组中,请使用(\[[^][]*])(?1)+。在这里,(?1)重新使用第1组子模式(即\[[^][]*])。
这里有一个PHP演示
$re = '~(?:\[[^][]*]){2,}~'; 
$str = "[one][two][three]"; 
preg_match($re, $str, $matches);
print_r($matches[0]); // => [one][two][three]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接