为什么一个单词在Regex(Perl)中打破了正确的输出



我想了解perl中正则表达的情况。

$str = "123-abc 23-rr";

需要在负旁边显示两个单词。正则表达式为:

@mas=$str=~/(?:([dw]+)-([dw]+))/gx;

它显示正确的输出:123abc23rr。但是,如果我稍微更改字符串并开始说一个字:

$str = "word 123-abc 23-rr";

我想考虑一下第一个单词,所以我更改了我的言论:

@mas=$str=~/w+s(?:s*([dw]+)-([dw]+))*/gx;

我的输出必须相同,但是有:23rr。如果我删除s**,则输出为123abc。但这仍然不对。有人知道为什么吗?

,而不是为越来越具体的字符串制作越来越具体的正直,请考虑利用整体模式。

  1. 每件作品都被空间分开。
  2. 第一件是一个单词。
  3. 其余的是用破折号分隔的。

首先将碎片分开。

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)值。

最新更新