正则字符串匹配字符串BAR,只要字符串FOO不会出现在它之前

时间:2013-03-05 18:43:59

标签: php regex ereg

我正在尝试编写一个正则表达式,只有字符串包含不在FOO之前的BAR。

例如,正则表达式与此不匹配:

FOO IS BAR

但是,请与此相符:

BAZ IS BAR

3 个答案:

答案 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没有任何问题。