这个问题很容易。我想在开头的一些字符串和结尾的一些字符串之间匹配任何内容。末尾的字符串应与开头的适当字符串匹配。
假设我要匹配介于[
和]
或{
与之间的所有内容}
。
可以使用的第一个正则表达式是:
/[{\[](.*)[}\]]/gmU
但是,这有一个问题。当主题是:
{aa} werirweiu [ab] wrewre [ac}
也[ac}
匹配,但不应该匹配。
它可以很容易地更改为:
/\[(.*)\]|\{(.*)\}/gmU
问题就解决了。
但是,如果(.*)
要复杂得多并且起点和终点例如是10,又又会有点复杂(不是一个字符而是很多),该怎么办?然后,使用上述规则,(.*)
应将整个重复重复10次,并且难以辨认。
有什么办法可以使开头与结尾匹配?例如,我想使用类似于
/(aa|bb)(.*)(cc|ddd)/gmU
告诉匹配必须以仅主题字符串开头aa
和结尾,cc
或者以bb
结尾和结尾,ddd
并且匹配aaxx1cc bbxx2ddd aaxx3ddd bbxx4cc
仅在主题字符串中进行,xx1
并且xx2
无需(.*)
在该正则表达式中重复很多次,并且记住上面示例中的开头和结尾可能不止2个。
在我看来,这是一个使用条件句的好地方。此正则表达式将起作用:
(?:(\[)|({)).*?(?(1)\])(?(2)})
其他种类的分隔符
这是易于扩展:例如,下面的模式将匹配之间分隔的字符串START
和END
之间,或者<--
和-->
之间,或者==:
和:==
(?:(START)|(<--)|(==:)).*?(?(1)END)(?(2)-->)(?(3):==)
请参阅Regex演示。
说明
(?:(\[)|({))
与开头定界符匹配,即[
该(\[)
捕捉到第1组|
{
该({)
捕捉到第2组.*?
懒惰地匹配到...(?(1)\])
如果设置了组1,我们匹配 ]
(?(2)})
如果设置了第2组,则我们匹配 }
参考
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句