如何使用PHP中的复杂正则表达式和Preg_Match_All检索重叠匹配

时间:2019-06-14 11:56:09

标签: php regex preg-match-all

已阅读以下内容,这些内容与我面临的问题有些重叠(双关语!): preg_match_all how to get *all* combinations? Even overlapping ones Overlapping matches with preg_match_all and pattern ending with repeated character

但是,我真的不知道如何将他们的答案应用于我的问题,这有点复杂。

我与preg_match_all()一起使用的正则表达式:

/.{240}[^\[]Order[^ ][^\(].{9}/u

带有以下字符串:

56A.  Subject to the provisions of this Act, any decision of the Court or the Appeal Board shall be final and conclusive, and no decision or order of the Court or the Appeal Board shall be challenged, appealed against, reviewed, quashed or called into question in any court and shall not be subject to any Quashing Order, Prohibiting Order, Mandatory Order or injunction in any court on any account.[20/99; 42/2005]

我打算精确匹配3次。第一场比赛在结束前有9个字符,称为“换行顺序”。第二场比赛的“禁止令”在比赛结束前9个字符。第三场比赛在结束前有9个字符为“必填”。

但是,正如预期的那样,它仅与第一个匹配,因为预期的匹配是重叠的。

我应用了我在其他帖子中读到的内容,我尝试了以下方法:

(?=(.{240}[^\[]Order[^ ][^\(].{9}))

我仍然没有得到我需要的东西。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

您可以使用

\w+\s+Order\b

请参见regex demo

正则表达式详细信息

  • \w+-一个或多个单词字符
  • \s+-1个或多个空格
  • Order\b-整个单词Order,因为\b是单词边界。

答案 1 :(得分:0)

您将需要对.{240}使用正向后断言,就像您发现的答案建议对.{9}使用正向先行断言一样:

/(?<=.{240})[^\[]Order[^ ][^\(](?=.{9})/u

由于[^ ],此RE仅与您的字符串匹配两次,如@bobblebubble所说。根据需要调整该部分。