检查字符串是否是使用正则表达式用逗号隔开的另一个字符串的子字符串[Perl]

Checking if a string is substring of another string separated by commas using regex [Perl]

我想使用regex来检查一个字符串是否是另一个字符串的子字符串,但是有一个附加规则:主字符串包含逗号,所以子字符串应该是用逗号分隔的字符串之一。

用一个例子更容易解释:

1
2
3
4
my $main_str ="   hello   ,how,   are, you";
my $sub1 ="hello";
my $sub2 ="how";
my $sub3 ="hello1";

对于$sub1$sub2,输出应为"在字符串中找到"。

对于sub3,它应该说"在字符串中找不到"。

您可以假定$sub只包含没有特殊符号(或空格)的字母a-Z

考虑以下regex:

1
@arr = ($main =~ /[^\s,]+/g);

有了这个regex,我可以用逗号将$main字符串拆分成一个数组,不带空格。我可以对数组进行迭代,检查其中是否有一个是$sub,但这需要一个额外的函数/循环来完成,这意味着它看起来不太好。我想用漂亮的正则表达式而不是循环来解决这个问题。

是否可以创建与上面类似的regex,它检查一个字符串是否是另一个字符串的子字符串,该字符串由逗号分隔,不包含空格?


只需用|分隔子字符串,并说它前面必须有一个开始或逗号,后面必须有一个结束或逗号。其中之一必须是环视断言,因为逗号结尾的一个子项可能是逗号开头的另一个子项:

1
2
3
4
5
6
7
8
9
10
11
#! /usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my $main_str ="   hello   ,how, are, you";
my @subs = qw( hello how hello1 you );

my $re = join '|', @subs;

say $1 while $main_str =~ /(?:^|,)\s*($re)\s*(?=,|$)/g;

取决于你检查这些匹配的频率以及多少…将单词放在哈希表中以便快速查找可能更快。

1
2
3
4
5
6
7
8
my $main_str ="   hello   ,how,   are, you";

my %words = map { $_ => 1 } $main_str =~ /\w+/g;

for my $sub (qw( hello how hello1 )) {
    printf("%8s : %s
"
, $sub, $words{$sub} ?"Found" :"Not found" );
}

产量

1
2
3
   hello : Found
     how : Found
  hello1 : Not found

我知道这不是你问题的真正答案(所以不要接受这个答案!).只是提供一个可能的替代方案。