others - 正规表达式 Perl正规表达式 | 如何从文件中排除单词

  显示原文与译文双语对照的内容

我正在寻找一些关于我在项目中的一些要求的Perl正则表达式语法。 首先,我想从txt文件( 词典) 中排除字符串。

例如,如果我的文件有这个字符串:


path.../Document.txt |


 tree


 car


 ship



我使用正则表达式

a1testtre -- match
orangesh1 -- match
apleship3 -- not match [contains word from file ]

另外还有一个我无法解决的需求。 我必须创建一个 正规表达式,它不允许字符串超过 3倍的字符重复( 两个字符) 。

例如:

adminnisstrator21 -- match (have 2 times a repetition of chars)
kkeeykloakk -- not match have over 3 times repetition
stack22ooverflow -- match (have 2 times a repetition of chars)

为此我尝试了


b(?:([a-z])(?!1))+b



但它只适用于第一个重复字符, 如何解决这两个?

时间:

排除包含给定列表中单词的字符串的一种方法是, 使用单词的交替形成 Pattern ( 匹配排除字符串) 。


use warnings;


use strict;


use feature qw(say);



use Path::Tiny;



my $file = shift//die"Usage: $0 filen"; #/



my @words = split ' ', path($file)->slurp;



my $exclude = join '|', map { quotemeta } @words;



foreach my $string (qw(a1testtre orangesh1 apleship3)) 


{ 


 if ($string!~/$exclude/) { 


 say"OK: $string"; 


 }


}



我使用 Path::Tiny 将文件读入字符串(""),然后用空格分割成字符串,用空格将它的分隔为单词。 quotemeta 转义 non-"单词"字符。 这可能会根据你的用例来调整和改进。

连续重复字符不会出现三次上的检查


foreach my $string (qw(adminnisstrator21 kkeeykloakk stack22ooverflow))


{


 my @chars_that_repeat = $string =~/(.)1+/g;



 if (@chars_that_repeat <3) { 


 say"OK: $string";


 }


}



一个长字符串( aaaa ) 计数作为一个实例,因为 正规表达式 中的+ 量词。 在字符串的各个位置重复相同的字符数,因此 aa_aa 计数为两次。

此片段可以添加到上述程序中,该程序使用包含用于排除的单词的文件名称进行调用。 它们都打印出所提供的示例中的预期内容。

...