如果不包含特定单词,则匹配字符串

时间:2019-02-25 16:35:31

标签: regex perl

my $var1=<<EO_STR;

abc,./()éà haha
hihi
hoho

EO_STR

my $var2=<<EO_STR;

abc,./()éà haha
hihi
**TOTO**
hoho

EO_STR

我有两个变量VAR1和VAR2,其中包含一个字符串,其中包含标点符号,特殊字符...,我想应用一个仅与变量的所有内容匹配的正则表达式TOTO,如果字符串包含TOTO,则不要在$ 1中返回任何内容给我,否则将变量中的所有文本返回到$ 1中。

这意味着如果我在$ var1上应用正则表达式,它将返回文本:“ abc,。/()éàhaha     嗨     hoho“在$ 1中,如果我在$ var2上应用相同的正则表达式,它将在$ 1中不返回任何内容,因为$ var2包含TOTO

我尝试过,但是不起作用:

$VAR1=~/((?!TOTO).)*/;
print $1."\n\n";

$VAR2=~/((?!TOTO).)*/;
    print $1."\n\n";

他在$ 1中什么也没回报……

3 个答案:

答案 0 :(得分:5)

您需要以下正则表达式

/^(?!.*TOTO)(.*)$/s

Regex 101尝试一下,以了解其功能

答案 1 :(得分:2)

我认为您应该简化逻辑:

  • 寻找单词边界\b
  • 加上单词TOTO
  • 加上单词边界\b
  • 使用负匹配运算符!~来应用正则表达式
#!/usr/bin/perl
use strict;
use warnings;

my $var1=<<EO_STR;

abc,./()éà haha
hihi
hoho

EO_STR

my $var2=<<EO_STR;

abc,./()éà haha
hihi
**TOTO**
hoho

EO_STR

foreach my $var ($var1, $var2) {
    if ($var !~ /\bTOTO\b/) {
        print "TOTO NOT FOUND; $var\n";
    } else {
        print "TOTO FOUND: $var\n";
    }
}

exit 0;

当然,如果您喜欢常规匹配运算符=~,则可以简单地反转逻辑:

if ($var =~ /\bTOTO\b/) {
    print "TOTO FOUND; $var\n";
} else {
    print "TOTO NOT FOUND: $var\n";
}

输出:

$ perl dummy.pl
TOTO NOT FOUND;
abc,./()éà haha
...
hoho
...
TOTO FOUND:
abc,./()éà haha
...
**TOTO**
...

答案 2 :(得分:2)

还可以使用运算符!〜,可以尝试以下代码:

print $var1 . "\n\n" if ( $var1 !~ /TOTO/ );