正则表达式 – 通过正则表达式进行不区分大小写的有序单词搜索

我刚刚开始在perl中使用正则表达式.在浏览了各种在线教程之后,我想要编写一个正则表达式来匹配命令指定的不区分大小写的单词匹配.

我正在尝试确定字符串“A”是否由字符串“B”的单词或单词序列组成,并且我希望不区分大小写地执行此操作.

例如,如果字符串“B”是“John Von Neumann”,则“JOhn”,“Von NeumaNn”,“VoN”,“john neuMann”将匹配,但字符串如“Joh”,“NeumaNn VoN”, “Vonn”不会是一场比赛.

我不知道如何使用正则表达式,任何想法?

最佳答案
让我们忽略一下.

John Von Neumann

可以匹配

John Von Neumann    1 1 1
John Von            1 1 0
John     Neumann    1 0 1
John                1 0 0
     Von Neumann    0 1 1
     Von            0 1 0
         Neumann    0 0 1

所以你正在寻找的正则表达式模式是

/^(?:John Von Neumann|John Von|John Newmann|John|...)\z/i

以下是构建列表的方法:

sub true_indexes {
   my ($n) = @_;
   my $i = 0;
   my @indexes;
   while ($n) {
      push @indexes, $i if $n & 1;
      ++$i;
      $n >>= 1;
   }
   return @indexes;
}

my @words = split(' ', 'John Von Neumann');

my @patterns;
unshift @patterns, join ' ', @words[ true_indexes($_) ]
   for 1 .. (2**@words)-1;

最后,我们可以生成模式:

my $pat = join '|', map quotemeta, @patterns;
my $re = qr/$pat/i;

你会像这样使用它:

if ($input =~ /^$re\z/) {
   print "match\n";
} else {
   print "no match\n";
}

转载注明原文:正则表达式 – 通过正则表达式进行不区分大小写的有序单词搜索 - 代码日志