我有一个很长的字符串(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
也在中间。
在谷歌搜索后,我认为我需要使用负向前瞻,但我迷路了,没有任何效果。您是否有任何建议仅使用正则表达式来解决此问题,而不进行任何其他字符串操作(爆炸、拆分...)?
您可以尝试这个正则表达式。我是用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”。