这个问题很简单。我想匹配开头的一些字符串和结尾的一些字符串之间的任何内容。 末尾的字符串应与开头的适当字符串匹配。
假设我想要匹配 [
和 ]
或 {
和 }
之间的所有内容。
可以使用的第一个正则表达式是:
/[{\[](.*)[}\]]/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)})
查看 the Regex Demo 中匹配和失败的内容.
其他类型的分隔符
这很容易扩展:例如,以下模式将匹配 START
之间分隔的字符串。和END
,或<--
之间和-->
,或==:
之间和:==
(?:(START)|(<--)|(==:)).*?(?(1)END)(?(2)-->)(?(3):==)
参见Regex Demo 。
说明
- 非捕获组
(?:(\[)|({))
匹配开始分隔符,即 -
[
其中(\[)
捕获到组 1 - 或
|
-
{
其中({)
捕获到第 2 组 -
.*?
懒惰地匹配到... -
(?(1)\])
如果设置了第 1 组,我们匹配]
-
(?(2)})
如果设置了第 2 组,我们匹配}
引用
关于regex - 使用可变左/右分隔符匹配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24944417/