Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式逻辑比较简化_Regex_Linux_Perl - Fatal编程技术网

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/ ) {
   ...
}