Qui*_*tic 5 regex string perl search
我刚刚开始在perl中使用正则表达式.在浏览了各种在线教程之后,我想要编写一个正则表达式来匹配命令指定的不区分大小写的单词匹配.
我正在尝试确定字符串"A"是否由字符串"B"的单词或单词序列组成,并且我希望不区分大小写地执行此操作.
例如,如果字符串"B"是"John Von Neumann",则"JOhn","Von NeumaNn","VoN","john neuMann"将匹配,但字符串如"Joh","NeumaNn VoN", "Vonn" 不会是一场比赛.
我不知道如何使用正则表达式,任何想法?
让我们忽略一下.
John Von Neumann
Run Code Online (Sandbox Code Playgroud)
可以匹配
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
Run Code Online (Sandbox Code Playgroud)
所以你正在寻找的正则表达式模式是
/^(?:John Von Neumann|John Von|John Newmann|John|...)\z/i
Run Code Online (Sandbox Code Playgroud)
以下是构建列表的方法:
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;
Run Code Online (Sandbox Code Playgroud)
最后,我们可以生成模式:
my $pat = join '|', map quotemeta, @patterns;
my $re = qr/$pat/i;
Run Code Online (Sandbox Code Playgroud)
你会像这样使用它:
if ($input =~ /^$re\z/) {
print "match\n";
} else {
print "no match\n";
}
Run Code Online (Sandbox Code Playgroud)