我在$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);
,因此它将非单词字符复制到数组列表中,这是我不想要的。
答案 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;