如何找到一个不在另一个特定单词之前的单词?

时间:2009-12-02 20:40:03

标签: php regex perl regex-negation

我可以使用哪个正则表达式来查找所有字符串bar,而不是字符串foo?在两者之间有空白也是非法的。

因此正则表达式应匹配以下字符串

foo is bar
hello bar

但不是这些

foobar
foo     bar

我尝试过使用以下

(?!<foo)bar

它完成了消除foobar的工作,但我需要处理空白,当然

(?!<foo)\s*bar

匹配所有字符串。

谢谢!

5 个答案:

答案 0 :(得分:4)

最好使用编程语言的其他功能,而不是对正则表达式模式看起来太难。

您正在寻找$s =~ /bar/ and not $s =~ /foo\s*bar/为真的字符串。

以下脚本的其余部分仅用于测试。

#!/usr/bin/perl

use strict; use warnings;

my %strings = (
    'foo is bar'  => 1,
    'hello bar'   => 1,
    'foobar'      => 0,
    'foo     bar' => 0,
    'barbar'      => 1,
    'bar foo'     => 1,
    'foo foo'     => 0,
);

my @accept = grep { $strings{$_} } keys %strings;
my @reject = grep { not $strings{$_} } keys %strings;

for my $s ( @accept ) {
    if ( $s =~ /bar/ and not $s =~ /foo\s*bar/ ) {
        print "Good: $s\n";
    }
    else {
        print "Bad : $s\n";
    }
}

for my $s ( @reject ) {
    if ( $s =~ /bar/ and not $s =~ /foo\s*bar/ ) {
        print "Bad : $s\n";
    }
    else {
        print "Good: $s\n";
    }
}

输出:

E:\srv\unur> j
Good: bar foo
Good: hello bar
Good: foo is bar
Good: barbar
Good: foo foo
Good: foo     bar
Good: foobar

答案 1 :(得分:2)

给出一些测试用例

my @match = (
  "foo is bar",
  "hello bar",
);

my @reject = (
  "foobar",
  "foo     bar",
);

你当然可以把一种模式的结果喂给另一种模式:

my @control = grep !/foo\s*bar/, grep /bar/ => @match, @reject;

我们也可以用一个:

my $nofoo = qr/
  (      [^f] |
    f  (?! o) |
    fo (?! o  \s* bar)
  )*
/x;

my $pattern = qr/^ $nofoo bar /x;

但是不要相信我的话。

for (@match) {
  print +(/$pattern/ ? "PASS" : "FAIL"), ": $_\n";
}

for (@reject) {
  print +(/$pattern/ ? "FAIL" : "PASS"), ": $_\n";
}

答案 2 :(得分:0)

  (?!<foo)\s*bar

这将与空白

匹配

答案 3 :(得分:0)

PHP:

!preg_match(/foo\s*bar/,$string) && preg_match(/bar/,$string)

perl的:

$string !~ /foo\s*bar/ && $string =~ /bar/

答案 4 :(得分:0)

从早期的答案中获取信息,包装为perl单行,并使正则表达式不区分大小写。

视窗:

perl -lne "print $_ if $_ !~ m/foo\s*bar/i && $_ =~ m/bar/i;" c:\temp\xx.txt

Linux的:

perl -lne 'print $_ if $_ !~ m/foo\s*bar/i && $_ =~ m/bar/i;' /tmp/xx.txt

xx.txt包含:

foo is bar
hello bar
foobar
foo     bar
barbar
bar foo
barfoo
foo foo

在命令提示符下执行单行程序的结果:

foo is bar
hello bar
barbar
bar foo
barfoo