Perl正则表达式|如何使用

时间:2019-04-22 10:45:54

标签: regex string file perl

我正在研究一个使用Perl正则表达式的新项目,我正在寻找一种使用单行Perl Regular模式从本地文件检索文本的方法。

我希望正则表达式为单行形式,并注意编码:

         ^(?!.....(?:........)).*$

我不想使用类似“代码样”的形式:

       use warnings;
       use strict;
       use feature qw(say);

       use Path::Tiny;
       my $file = shift // die "Usage: $0 file\n";  #/
       my @words = split ' ', path($file)->slurp;
       my $exclude = join '|', map { quotemeta } @words;
       foreach my $string (qw(a1testtre orangesh1 apleship3)) 
       { 
           ........
           ........ 
           }
        }

我的最终目标是搜索(使用一行Perl正则表达式!! )一个txt文件的字符串,然后检查其中一个是否属于我正在测试的字符串的一部分。 到目前为止,我已经创建了一个Perl正则表达式

  ->        ^(?!.*(?:banned)).*$

检查我正在测试的字符串中是否包含“ banned”一词。

在此处查看示例:https://regex101.com/r/toQpCb/1

现在我是否可以用某种方式将“被禁止的”世界替换为我希望可以使用的本地文件(txt)的内容。合适的解决方案可能是:

    ^(?!.*(?:\someway_the_string_from_me_local_txt_file\)).*$

1 个答案:

答案 0 :(得分:1)

您要检查每个位置都不是您所说的一个单词的开头,所以您实际上想要

^(?:(?!WORD1|WORD2|...).)*\z

如此

my $good_re = qr/^(?:(?!$exclude).)*\z/s;

if ($string =~ $good_re) {
   # Good
} else {
   # Bad
}

但是,与其检查字符串是否“安全”,不如检查它是否不安全(然后简单地将结果取反),效率更高。

my $bad_re = qr/$exclude/;

if ($string =~ $bad_re) {
   # Bad
} else {
   # Good
}