我正在尝试编写一个正则表达式,只有字符串包含不在FOO之前的BAR。
例如,正则表达式与此不匹配:
FOO IS BAR
但是,请与此相符:
BAZ IS BAR
答案 0 :(得分:4)
(?<!FOO.*)BAR
是正确的正则表达式(但它只适用于.NET正则表达式引擎)。
(?<!FOO.*)
是negative lookbehind assertion,声称在当前位置之前无法匹配包含FOO
的任何字符串。
在PHP中,你没有无限的外观。另一种选择是
^(?:(?!FOO|BAR).)*BAR
<强>解释强>
^ # Start of string
(?: # Match...
(?! # (unless the following can be matched here:
FOO # either FOO
| # or
BAR # BAR)
) # (end of lookahead)
. # ... any character.
)* # Repeat as needed
BAR # Match BAR
但是,即使这不适用于已弃用的ereg
函数。您需要preg
函数才能使用外观断言。
但我认为有一种方法适用于ereg
:
^(FO?|[^FO]|[^O]O)*BAR
<强>解释强>
^ # Start of string
( # Either match:
FO? # F or FO
| # or
[^FO] # any character except F or O
| # or
[^O]O # any non-O character followed by O
)* # any number of times
BAR # Then match BAR
但是,如果您的排除字符串比FOO
更复杂,这将非常复杂......
答案 1 :(得分:3)
您可以使用此正则表达式
^(?=.*BAR)(?!.*?FOO.*?BAR).*$
--------- --------------
| |
| |proceed only if there's no FOO before BAR...
|->proceed only if there's a BAR...CHEERS..
答案 2 :(得分:1)
您可能会发现将它放入两个正则表达式更容易。例如,如果我们正在谈论Perl,那么你可以做到
if ( /BAR/ && !/FOO.*BAR/ )
对我而言,比试图做出负面的背后更清楚。
由于您似乎使用的是PHP,我认为/BAR/
上的preg_match和另一个不匹配/FOO.*BAR/
的preg_match没有任何问题。