我可以使用哪个正则表达式来查找所有字符串bar
,而不是字符串foo
?在两者之间有空白也是非法的。
因此正则表达式应匹配以下字符串
foo is bar
hello bar
但不是这些
foobar
foo bar
我尝试过使用以下
(?!<foo)bar
它完成了消除foobar
的工作,但我需要处理空白,当然
(?!<foo)\s*bar
匹配所有字符串。
谢谢!
答案 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