我想了解perl中正则表达的情况。
$str = "123-abc 23-rr";
需要在负旁边显示两个单词。正则表达式为:
@mas=$str=~/(?:([dw]+)-([dw]+))/gx;
它显示正确的输出:123
,abc
,23
,rr
。但是,如果我稍微更改字符串并开始说一个字:
$str = "word 123-abc 23-rr";
我想考虑一下第一个单词,所以我更改了我的言论:
@mas=$str=~/w+s(?:s*([dw]+)-([dw]+))*/gx;
我的输出必须相同,但是有:23
,rr
。如果我删除s*
或*
,则输出为123
,abc
。但这仍然不对。有人知道为什么吗?
,而不是为越来越具体的字符串制作越来越具体的正直,请考虑利用整体模式。
- 每件作品都被空间分开。
- 第一件是一个单词。
- 其余的是用破折号分隔的。
首先将碎片分开。
my @pieces = split /s+/, $str;
然后删除第一件,不必分开。
my $word = shift @pieces;
然后将-
上的每一部分分成成对。
my %pairs = map { split /-/, $_ } @words;
对于每场比赛,每次捕获都会返回。
在第一个片段中,图案匹配两次。
123-abc 23-rr
_____/ ___/
有两个捕获,因此返回了四个(2*2 = 4)值。
在第二个片段中,图案匹配一次。
word 123-abc 23-rr
________________/
有两个捕获,因此返回了两个(2*1 = 2)值。