Perl正则表达式匹配字符串没有结束的东西

时间:2013-01-09 12:11:24

标签: regex perl negative-lookahead

正确的正则表达式会正确匹配吗?我想识别不以特定文本结尾的字符串(_array)。我试图使用负向前瞻但无法使其正常工作。 (注意显而易见的答案是反向(m {_array $}),但有一个原因我不想这样做)。 TIA

 use strict;
 use warnings;
 while(<DATA>) {
    #
    ## If the string does not end with '_array' print No, otherwise print Yes
    m{(?!_array)$} ? print "No  = " : print "Yes = ";
    print;
 }
 __DATA__
 chris
 hello_world_array
 another_example_array
 not_this_one
 hello_world

我想要的输出应该是:

 No  = chris
 Yes = hello_world_array
 Yes = another_example_array
 No  = not_this_one
 No  = hello_world

2 个答案:

答案 0 :(得分:6)

您需要在后面看。即你想要搜索不在_array之前的字符串的结尾。

请注意,您需要首先chomp该行,因为$将在尾随换行符之前和之后匹配。

条件运算符用于返回 - 它不是if语句的简写。

use strict;
use warnings;

while (<DATA>) {
  chomp;
  # If the string does not end with '_array' print No, otherwise print Yes
  print /(?<!_array)$/ ? "No  = $_\n" : "Yes = $_\n";
}

__DATA__
chris
hello_world_array
another_example_array
not_this_one
hello_world

<强>输出

No  = chris
Yes = hello_world_array
Yes = another_example_array
No  = not_this_one
No  = hello_world

答案 1 :(得分:2)

试试这个:

while(<DATA>) {
    chomp;   #remove linefeed
    #
    ## If the string does not end with '_array' print No, otherwise print Yes
    m{(?<!_array)$} ? print "No  = " : print "Yes = ";
    say;
}

<强>输出:

No  =  chris
Yes =  hello_world_array
Yes =  another_example_array
No  =  not_this_one
No  =  hello_world