【发布时间】:2016-06-20 10:06:31
【问题描述】:
假设我们有这个文本:
...
settingsA=9, 4.2
settingsB=3, 1.5, 9, 2, 4, 6
settingsC=8, 3, 2.5, 1
...
问题是如何一步一步捕获特定行中的所有数字?
单步意味着:
- 单个正则表达式模式。
- 单一操作(无循环或拆分等)
- 所有匹配都被捕获在一个数组中。
假设我想捕获以settingsB= 开头的行中的所有数字。最终结果应如下所示:
3
1.5
9
2
4
6
我的失败尝试:
<?php
$subject =
"settingsA=9, 4.2
settingsB=3, 1.5, 9, 2, 4, 6
settingsC=8, 3, 2.5, 1";
$pattern = '([\d\.]+)(, )?' // FAILED!
$pattern = '(?:settingsB=)(?:([\d\.]+)(?:, )?)' // FAILED!
$pattern = '(?:settingsB=)(?:([\d\.]+)(?:, )?)+' // FAILED!
$pattern = '(?<=^settingsB=|, )([\d+\.]+)' // FAILED!
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);
if ($matches) {
print_r($matches);
}
?>
更新 1: 不幸的是,@Saleem 的示例使用了多个步骤而不是单个步骤。我并不是说他的例子不好(它实际上有效),但我想知道是否有另一种方法可以做到这一点以及如何做到这一点。有什么想法吗?
更新 2: @bobble bubble 为这一挑战提供了完美的解决方案。
【问题讨论】:
-
请提及您的环境、语言。例如PHP、python、java、JavaScript等甚至编辑器、Notepad++
-
我猜是通用引擎,没有语言,除了正则表达式。
-
是的,但这将是一个多阶段的解决方案。捕获+分词器
-
我已经在 python 中发布了解决方案,因为 php 目前不可用。但是 python 和 php 正则表达式非常相似。
标签: php regex text notepad++ pcre