问题很简单。我想在开头的一些字符串和最后的一些字符串之间匹配任何内容。 最后的字符串应匹配开头的相应字符串。
我们假设我希望匹配[
和]
或{
和}
之间的所有内容。
可以使用的第一个正则表达式是:
/[{\[](.*)[}\]]/gmU
{aa} werirweiu [ab] wrewre [ac}
也[ac}
匹配但不应该匹配。
可以很容易地改为:
/\[(.*)\]|\{(.*)\}/gmU
问题解决了。
但是,如果(.*)
更加复杂,开始和结束将是例如10,它们也会更复杂(不是一个字符,而是很多)?然后使用上面的规则,整个(.*)
应该重复10次,这将是难以理解的。
有没有办法将结尾与开头匹配?例如,我想使用类似于
的语法 /(aa|bb)(.*)(cc|ddd)/gmU
告诉该匹配必须以aa
开头,以cc
结尾,或以bb
开头,以ddd
结尾,并在主题{{}中匹配1}}只有字符串aaxx1cc bbxx2ddd aaxx3ddd bbxx4cc
和xx1
,而不会在正则表达式中多次重复xx2
,并且记住上面的例子中的开头和结尾可能会超过2个。
答案 0 :(得分:7)
在我看来,这是使用条件的一个非常好的地方。这个正则表达式将起作用:
(?:(\[)|({)).*?(?(1)\])(?(2)})
在the Regex Demo中查看匹配和失败的内容。
其他种类的分隔符
这很容易扩展:例如,以下模式将匹配START
和END
之间,<--
和-->
之间或{{}之间分隔的字符串1}}和==:
:==
请参阅 Regex Demo 。
<强>解释强>
(?:(START)|(<--)|(==:)).*?(?(1)END)(?(2)-->)(?(3):==)
与开头分隔符匹配,即(?:(\[)|({))
[
捕获到第1组
(\[)
|
{
捕获到第2组
({)
懒洋洋地匹配...... .*?
如果设置了第1组,我们会匹配(?(1)\])
]
如果设置了第2组,我们会匹配(?(2)})
<强>参考强>