PHP 正则表达式匹配不包含特定字符串的组

问题描述 投票:0回答:1

我有一个很长的字符串(2k 个字符),我想将每个匹配项与具有以下内容的 PHP 匹配:

aaa
+ 任何内容 +
bbb
+ 任何内容 +
ccc

例如,我想要这样的匹配:

aaa xx bbb y ccc

aaa uuu o bbb l iii ccc

使用正则表达式很容易获得,但有一个问题:所有比赛只能在开头有

aaa
,我不能在比赛中间的任何地方有
aaa

我尝试了这个正则表达式

/aaa.+?bbb.+?ccc/
,但它匹配像
aaa h bbb aaa ccc
这样的东西,这不是我需要的,因为
aaa
也在中间。

在谷歌搜索后,我认为我需要使用负向前瞻,但我迷路了,没有任何效果。您是否有任何建议仅使用正则表达式来解决此问题,而不进行任何其他字符串操作(爆炸、拆分...)?

regex
1个回答
0
投票

您可以尝试这个正则表达式。我是用Python写的。您可以将相同的正则表达式转换为另一种语言

pattern = r'^aaa(?:(?!aaa|bbb|ccc).)*bbb(?:(?!aaa|bbb|ccc).)*ccc'
string = "aaa h bbb aaa ccc"
if re.match(pattern, 'aaaaa bbb df ccc'): print(True)

在此模式中:

  • ^
    :断言字符串的开头。
  • aaa
    :匹配文字字符“aaa”。
  • (?:(?!aaa|bbb|ccc).)*
    :这部分是一个非捕获组 (?: ... ),匹配任何
    (.*)
    ,但每个字符都被检查不是“aaa”、“bbb”或“ccc”的开头使用负前瞻(?!aaa | bbb | ccc)。这可确保“aaa”、“bbb”或“ccc”不会出现在第一次出现“aaa”和“bbb”之间的任何位置。
  • bbb
    :匹配文字字符“bbb”。
  • (?:(?!aaa|bbb|ccc).)*
    :与前一部分类似,它是另一个非捕获组 (?: ... ),匹配任何
    (.*)
    ,但检查所有字符都不是“aaa”、“bbb”的开头,或使用负前瞻的“ccc”。
  • ccc
    :匹配文字字符“ccc”。
© www.soinside.com 2019 - 2024. All rights reserved.