7

barすべての文字列の前に文字列がないことを見つけるために使用できる正規表現はどれfooですか?2つの間に空白を置くことも違法です。

したがって、正規表現は次の文字列と一致する必要があります

foo is bar
hello bar

しかし、これらではありません

foobar
foo     bar

私は以下を使ってみました

(?!<foo)bar

そしてそれは排除するための仕事をfoobar成し遂げます、しかし私は空白の世話をする必要があります、そしてもちろん

(?!<foo)\s*bar

すべての文字列に一致します。

ありがとう!

4

5 に答える 5

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
良い: バー フー
良い: ハロー バー
良い: foo is bar
良い: バーバー
良い: フーフー
良い: フーバー
良い: フーバー
于 2009-12-02T20:57:23.467 に答える
2

いくつかのテストケースが与えられた場合

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

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

もちろん、あるパターンの結果を別のパターンにフィードすることで実行できます。

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

1つでそれを行うこともできます:

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";
}
于 2009-12-02T20:51:49.883 に答える
0
  (?!<foo)\s*bar

これは空白に一致します

于 2009-12-02T20:42:47.273 に答える
0

php:

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

パール:

$string !~ /foo\s*bar/ && $string =~ /bar/
于 2009-12-02T20:46:58.880 に答える