Regex 正则表达式逻辑比较简化
我有多个复杂的逻辑,其中一个是比较两个字符串Regex 正则表达式逻辑比较简化,regex,linux,perl,Regex,Linux,Perl,我有多个复杂的逻辑,其中一个是比较两个字符串 $db_string_param1 = 'AA1 AB AC1 AK1 BKK2'; $file_string_param1 = 'AK1B25'; 我需要测试$file\u string\u param1是否包含$db\u string\u param1的任何内容,这些内容由空格分隔,而不使$db\u string\u param1成为数组 我在想,也许使用正则表达式可以做到这一点,但目前我不太擅长使用复杂正则表达式。假设您的数据没有包含可以在
$db_string_param1 = 'AA1 AB AC1 AK1 BKK2';
$file_string_param1 = 'AK1B25';
我需要测试$file\u string\u param1
是否包含$db\u string\u param1
的任何内容,这些内容由空格分隔,而不使$db\u string\u param1
成为数组
我在想,也许使用正则表达式可以做到这一点,但目前我不太擅长使用复杂正则表达式。假设您的数据没有包含可以在替换中使用simple
的特殊字符s/\s/|/g
在下面的正则表达式替换中,我处理了特殊字符
将空格和非单词字符分组。然后,e
用于将右侧作为表达式计算的标志。然后检查是否定义了$1
,如果已定义,请使用|
分隔。如果未定义,则表示$2
包含特殊字符,以便可以转义该字符
$file_string_param1 = 'AK1B25';
$db_string_param1 = 'AA1 AB AC1 AK1 BKK2';
$db_string_param1=~s/(\s)|(\W)/ defined($1) ? "|" : "\\$2" /ge;
$file_string_param1=~m/$db_string_param1/;
print $&,"\n";
您没有解释为什么不希望将数据库参数转换为数组,因此很难理解您的意图,但本程序演示了如何将字符串转换为正则表达式模式,并针对它测试文件参数
use strict;
use warnings 'all';
use feature 'say';
my $db_string_param1 = 'AA1 AB AC1 AK1 BKK2';
my $file_string_param1 = 'AK1B25';
( my $db_re = $db_string_param1 ) =~ s/\A\s+|\s+\z//g;
$db_re =~ s/\s+/|/g;
$db_re = qr/$db_re/;
say $file_string_param1 =~ /(?<![A-Z])(?:$db_re)(?![0-9])/ ? 'found' : 'not found';
此解决方案不存在正则表达式注入错误。无论用空格分隔哪些字符,它都将起作用
my $pat = join '|', map quotemeta, split ' ', $db_string_param1;
if ( $file_string_param1 =~ /$pat/ ) {
...
}
请解释“不使
$db\u string\u param1
成为数组”。唯一明智的方法是将其中一个字符串转换为令牌列表。谢谢!如果我使用一个数组并循环它,我的代码将看起来更复杂,除了所有其他涉及的逻辑。我只是想尽量简化所有涉及的逻辑。Re“此解决方案不存在regex注入错误”,而该主持人提供的文本确实暗示其他解决方案确实存在此错误,我想指出的是,mkHun的解决方案并非如此。如果在第一个捕获组中使用\s+
而不是\s
,那么这个答案可能会更好—否则在$db\u string\u param1
中使用额外的空格可能会导致误报。
my $pat = join '|', map quotemeta, split ' ', $db_string_param1;
if ( $file_string_param1 =~ /$pat/ ) {
...
}