匹配多个模式并将子模式提取到perl中的数组中

时间:2017-05-11 22:21:44

标签: perl design-patterns pattern-matching match

我在$str中有以下字符串:

assign (rregbus_z_partially_resident | regbus_s_partially_resident | reg_two | )regbus_;

我想解析这一行,只捕获所有以非单词字符开头的字符串,然后将reg_\w+regbus_\w+捕获到数组中。

所以在上面的例子中,我只想捕获 <{1}}和regbus_s_partially_resident到数组中。

我试过这个并没有用:

reg_two

由于我正在尝试使用my (@all_matches) = ($str =~ m/\W(reg_\w+)|\W(regbus_\w+)/g); ,因此它将非单词字符复制到数组列表中,这是我不想要的。

2 个答案:

答案 0 :(得分:2)

需要对你的正则表达式进行一些调整

my @all_matches = $str =~ m/\W(reg_\w+|regbus_\w+)/g;

my @all_matches = $str =~ m/\W( (?:reg|regbus)_\w+ )/gx;

甚至是

的内容
my @all_matches = $str =~ m/\W( reg(?:bus)?_\w+ )/gx;

最合适的形式取决于您可能需要的模式以及使用方式。

或者,将正则表达式的使用减少到问题的核心

my @matches = grep { /^(?:reg_\w+|regbus_\w+)/ } split /\W/, $str;

如果您的字符串和/或要求变得更加复杂,可能会有所帮助。

答案 1 :(得分:2)

  

将非单词字符复制到数组列表中

不,它没有。

$ perl -le'
   my $str = "assign (rregbus_z_partially_resident | regbus_s_partially_resident | reg_two | )regbus_;";
   my (@all_matches) = ($str =~ m/\W(reg_\w+)|\W(regbus_\w+)/g);
   print $_ // "[undef]" for @all_matches;
'
[undef]
regbus_s_partially_resident
reg_two
[undef]

但是你确实遇到了问题:你有两次捕获,所以每次匹配你会获得两个值。

修正:

my @all_matches;
push @all_matches, $1 // $2 while $str =~ m/\W(reg_\w+)|\W(regbus_\w+)/g;

好多了:

my @all_matches = $str =~ m/\W(reg(?:bus)?_\w+)/g;

更好的是:

my @all_matches = $str =~ m/\b(reg(?:bus)?_\w+)/g;