【问题标题】:Matching repetition with capturing groups returns only the final match value使用捕获组匹配重复仅返回最终匹配值
【发布时间】:2016-03-16 17:58:09
【问题描述】:

我正在尝试使用匹配重复与捕获组来捕获递归序列。

这是一个示例文本:

some_string_here  00  12.34  34  56.78  78.90

用于捕获所有浮点值的正则表达式:

\S+(?:\s+(\d+(?:\.\d+)?)){5}

正则表达式按预期匹配所有浮点值,但捕获组仅返回最终匹配结果。

Group #1: 78.90

要求的结果是:

Group #1: 00
Group #2: 12.34
Group #3: 34
Group #4: 56.78
Group #5: 78.90

如果我使用以下作为正则表达式,结果符合预期,但递归序列太多,正则表达式太长。

\S+(?:\s+(\d+(?:\.\d+)?))(?:\s+(\d+(?:\.\d+)?))(?:\s+(\d+(?:\.\d+)?))(?:\s+(\d+(?:\.\d+)?))(?:\s+(\d+(?:\.\d+)?))

有没有办法通过捕获组捕获匹配重复中的所有浮点值?

【问题讨论】:

  • “正则表达式太长”是什么意思
  • 这是 Perl 正则表达式的工作方式。只有一对括号只能有一次捕获。看起来你应该只使用split
  • @Akshay Belvadi 你的正则表达式重复(?:\s+(\d+(?:\.\d+)?)) 6 次将是错误的some_string_here 00 12.34 34 56.78 78.90 78.90(7 个数字)/(?:\s+(\d+(?:\.\d+)?))/g 也会起作用。

标签: regex perl


【解决方案1】:

试试这个

$s = "some_string_here  00  12.34  34  56.78  78.90";
@ar = $s =~m/(\d+\.?(?:\d+)?)/g;
$, = "\n";
print @ar;

g 标志返回列表中所有可能的匹配项。并且列表被存储到数组中。所以它会在一个数组中给出所有可能的匹配项。

如果不使用g 全局修饰符,它会返回唯一一个元素00。因为搜索将在第一次匹配时满足。

输出

00
12.34
34 
56.78
78.90

如果你想存储特定数量的元素,创建列表并给出变量

例如,您要存储仅有的三个匹配项,

($first,$second,$thrid) = $s =~m/(\d+\.?(?:\d+)?)/g;

这里$first holds the 00, $second holds the 12.34 and the $third holds the 34.

【讨论】:

    【解决方案2】:

    正如我在评论中提到的,你可能只想要split,就像这样

    my $s = 'some_string_here  00  12.34  34  56.78  78.90';
    
    my @groups = split ' ', $s;
    shift @groups;
    
    for my $i ( 0 .. $#groups ) {
        printf "Group #%d: %-s\n", $i+1, $groups[$i];
    }
    

    输出

    Group #1: 00
    Group #2: 12.34
    Group #3: 34
    Group #4: 56.78
    Group #5: 78.90
    

    【讨论】:

      【解决方案3】:

      试试这个

      (\d+\.?\d*)
      

      Demo

      输入

      some_string_here  00  12.34  34  56.78  78.90
      

      输出

      MATCH 1
      1.  [18-20] `00`
      MATCH 2
      1.  [22-27] `12.34`
      MATCH 3
      1.  [29-31] `34`
      MATCH 4
      1.  [33-38] `56.78`
      MATCH 5
      1.  [40-45] `78.90`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        • 2014-01-20
        相关资源
        最近更新 更多