正则表达式逻辑比较简化

时间:2017-06-20 02:34:47

标签: regex linux perl

我有多个复杂的逻辑,其中一个是2个字符串的比较。

$db_string_param1 = 'AA1 AB AC1 AK1 BKK2';

$file_string_param1 = 'AK1B25';

我需要测试$file_string_param1是否包含$db_string_param1的任何内容,由空格分隔而不使$db_string_param1成为数组。

我想也许使用正则表达式是可能的,现在我使用复杂的正则表达式并不是那么好。

3 个答案:

答案 0 :(得分:0)

假设您的数据不包含您可以在替换|中使用简单s/\s/|/g的特殊字符。

在下面的RegEx替换中,我处理了特殊字符。

对空格和非单词字符进行分组。然后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";

答案 1 :(得分:0)

此解决方案不会受到正则表达式注入错误的影响。无论什么字符被空格分隔,它都会起作用。

my $pat = join '|', map quotemeta, split ' ', $db_string_param1;

if ( $file_string_param1 =~ /$pat/ ) {
   ...
}

答案 2 :(得分:-1)

您无法解释为什么您不希望将数据库参数转换为数组,因此很难理解您的意图,但此程序演示了如何将字符串转换为正则表达式模式并测试反对它的文件参数

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';

输出

found