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,它检查一个字符串是否是另一个字符串的子字符串,该字符串由逗号分隔,不包含空格?
- 逗号不相关。$main_string =~ /\b$sub1\b/出了什么问题?
只需用|分隔子字符串,并说它前面必须有一个开始或逗号,后面必须有一个结束或逗号。其中之一必须是环视断言,因为逗号结尾的一个子项可能是逗号开头的另一个子项:
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 |
我知道这不是你问题的真正答案(所以不要接受这个答案!).只是提供一个可能的替代方案。