为什么一个词在正则表达式(perl)中打破了所有正确的输出?

时间:2016-12-02 17:59:57

标签: regex perl

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

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

需要在减号旁边显示两个单词。 正则表达式是:

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

它显示正确的输出:123abc23rr。 但是如果我稍微改变字符串并在开头写一个字:

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

我想先考虑这个词,所以我改变了我的正则表达式:

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

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

2 个答案:

答案 0 :(得分:1)

对于每个匹配,返回每个捕获。

在第一个片段中,模式匹配两次。

123-abc 23-rr
\_____/ \___/

有两个捕获,因此返回四个(2 * 2 = 4)值。

在第二个片段中,模式匹配一​​次。

word 123-abc 23-rr
\________________/

有两个捕获,因此返回两个(2 * 1 = 2)值。

答案 1 :(得分:1)

不要为更具体的字符串制作更具体的正则表达式,而应考虑利用整体模式。

  1. 每件作品用空格分开。
  2. 第一件就是一个字。
  3. 其余的是由破折号分隔的对。
  4. 首先在空白处拆分。

    my @pieces = split /\s+/, $str;
    

    然后删除第一块,不必拆分。

    my $word = shift @pieces;
    

    然后将-上的每一部分分成两对。

    my %pairs = map { split /-/, $_ } @words;