我正在尝试使用匹配重复和捕获组来捕获递归序列。
这是一个示例文本:
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/