regex - 使用捕获组匹配重复仅返回最终匹配值

标签 regex perl

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

这是一个示例文本:

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+)?))

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

最佳答案

试试这个

$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 持有 00,$second 持有 12.34,$third 持有 34。

关于regex - 使用捕获组匹配重复仅返回最终匹配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36030437/

相关文章:

javascript - 正则表达式按文本包含少于 n 个字符的标签拆分 HTML

javascript - 奇怪的 Javascript 字符串用 $& 替换行为

regex - Bash:从 HTTP 响应中删除 header

mysql - 如何返回 MySQL 中的 REGEXP 匹配项

java - 如果找到正则表达式拒绝

perl - 通过 perl 脚本在文件中替换

perl - 如何使Mason2 UTF-8干净?

perl - 如何从 perlcc -B 反编译 perl 字节码?

perl - 如何调用类:method determined at runtime in perl?

perl 检查一行是否包含列表中的一个单词