regex - 使用可变左/右分隔符匹配字符串

标签 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 结尾,并在主题 aaxx1cc bbxx2ddd aaxx3ddd bbxx4cc 中仅匹配字符串 xx1xx2,而无需在该正则表达式中多次重复 (.*),并且记住可能有超过 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/

相关文章:

regex - regexp_replace 上的函数导致 Postgres

javascript - 检查字符串是否以范围内的数字开头

php - 我如何在 PHP 中运行这个正则表达式来解析带有名称的完整电子邮件地址?

c# - 如何使用 C# .net 查找字符串中的最后一个字母

PHP 反向 Preg_match

php - PCRE 过滤扩展名的文件

php - 如何将Wordpress标题标签转换为html div标签

php - 检测文本中的电子邮件

php - Preg 仅替换数字和/或用百分比表示的数字

php - 在正则表达式中允许一些 url