【问题标题】:match string if does not contain a specific word如果不包含特定单词,则匹配字符串
【发布时间】:2019-02-25 16:35:31
【问题描述】:
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 美元他什么也没返回......

【问题讨论】:

  • $VAR != $var1 这是您代码中的错字吗?
  • 先检查/\bTOTO\b不匹配不是更容易吗?如果不匹配,字符串就是你想要的结果。

标签: regex perl


【解决方案1】:

您需要以下正则表达式

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

Regex 101 尝试一下,了解它的作用

【讨论】:

    【解决方案2】:

    你也可以使用运算符!~,你可以试试下面的代码:

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

    【讨论】:

      【解决方案3】:

      我认为你应该简化你的逻辑:

      • 寻找单词边界\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**
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多