使用正则表达式[Perl]

时间:2018-07-10 12:12:46

标签: regex string perl

我想使用正则表达式来检查一个字符串是否是另一个字符串的子字符串,但是要有一个附加规则:主字符串包括逗号,因此子字符串应该是用逗号分隔的字符串之一。

使用示例更容易解释:

my $main_str = "   hello   ,how,   are, you";
my $sub1 = "hello";
my $sub2 = "how";
my $sub3 = "hello1";

对于$sub1$sub2,输出应显示-“在字符串中找到”。

对于sub3,应该说-“在字符串中找不到”。

您可以假设$sub包含唯一的字母a-Z,并且没有特殊符号(或空格)。

考虑以下正则表达式:

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

使用此正则表达式,我可以将$main字符串按逗号分隔成一个没有空格的数组。我可以遍历该数组并检查其中一个是否为$sub,但这样做将需要一个附加的函数/循环-这看起来不太好。我想用漂亮的正则表达式而不是循环来解决这个问题。

是否可以创建类似于上述正则表达式的正则表达式,该正则表达式检查一个字符串是否是另一个字符串的子字符串,该子字符串由逗号分隔并且不包含空格?

2 个答案:

答案 0 :(得分:3)

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

#! /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)

根据您检查这些匹配项的频率以及有多少...可能可能更快地将单词放入哈希以进行快速查找

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\n", $sub, $words{$sub} ? "Found" : "Not found" );
}

输出

   hello : Found
     how : Found
  hello1 : Not found

我知道这并不是您所提问题的答案(因此请不要接受此答案!)。只是提供一个可能的选择。