我想了解Perl中正则表达式的情况。
$str = "123-abc 23-rr";
需要在减号旁边显示两个单词。 正则表达式是:
@mas=$str=~/(?:([\d\w]+)\-([\d\w]+))/gx;
它显示正确的输出:123
,abc
,23
,rr
。
但是如果我稍微改变字符串并在开头写一个字:
$str = "word 123-abc 23-rr";
我想先考虑这个词,所以我改变了我的正则表达式:
@mas=$str=~/\w+\s(?:\s*([\d\w]+)\-([\d\w]+))*/gx;
我的输出必须相同,但有:23
,rr
。如果我删除\s*
或*
,则输出为123
,abc
。但它仍然不对。谁知道为什么?
答案 0 :(得分:1)
对于每个匹配,返回每个捕获。
在第一个片段中,模式匹配两次。
123-abc 23-rr
\_____/ \___/
有两个捕获,因此返回四个(2 * 2 = 4)值。
在第二个片段中,模式匹配一次。
word 123-abc 23-rr
\________________/
有两个捕获,因此返回两个(2 * 1 = 2)值。
答案 1 :(得分:1)
不要为更具体的字符串制作更具体的正则表达式,而应考虑利用整体模式。
首先在空白处拆分。
my @pieces = split /\s+/, $str;
然后删除第一块,不必拆分。
my $word = shift @pieces;
然后将-
上的每一部分分成两对。
my %pairs = map { split /-/, $_ } @words;