将字符串与可变左/右分隔符匹配

时间:2014-07-24 21:36:10

标签: regex preg-replace preg-match pcre

问题很简单。我想在开头的一些字符串和最后的一些字符串之间匹配任何内容。 最后的字符串应匹配开头的相应字符串

我们假设我希望匹配[]{}之间的所有内容。

可以使用的第一个正则表达式是:

/[{\[](.*)[}\]]/gmU

然而,它有一个问题。主题是:

{aa} werirweiu [ab] wrewre [ac}

[ac}匹配但不应该匹配。

可以很容易地改为:

/\[(.*)\]|\{(.*)\}/gmU

问题解决了。

但是,如果(.*)更加复杂,开始和结束将是例如10,它们也会更复杂(不是一个字符,而是很多)?然后使用上面的规则,整个(.*)应该重复10次,这将是难以理解的。

有没有办法将结尾与开头匹配?例如,我想使用类似于

的语法

/(aa|bb)(.*)(cc|ddd)/gmU告诉该匹配必须以aa开头,以cc结尾,或以bb开头,以ddd结尾,并在主题{{}中匹配1}}只有字符串aaxx1cc bbxx2ddd aaxx3ddd bbxx4ccxx1,而不会在正则表达式中多次重复xx2,并且记住上面的例子中的开头和结尾可能会超过2个。

1 个答案:

答案 0 :(得分:7)

使用条件

在我看来,这是使用条件的一个非常好的地方。这个正则表达式将起作用:

(?:(\[)|({)).*?(?(1)\])(?(2)})

the Regex Demo中查看匹配和失败的内容。

其他种类的分隔符

这很容易扩展:例如,以下模式将匹配STARTEND之间,<---->之间或{{}之间分隔的字符串1}}和==:

:==

请参阅 Regex Demo

<强>解释

  • 非捕获组(?:(START)|(<--)|(==:)).*?(?(1)END)(?(2)-->)(?(3):==) 与开头分隔符匹配,即
  • {li> (?:(\[)|({)) [捕获到第1组
  • (\[)
  • {li> | {捕获到第2组
  • ({)懒洋洋地匹配......
  • .*?如果设置了第1组,我们会匹配(?(1)\])
  • ]如果设置了第2组,我们会匹配(?(2)})

<强>参考