【发布时间】:2015-06-17 18:08:53
【问题描述】:
我从表格布局中提取了一大段文本,类似于:
Waiting Period 30 days of employment 30 days of employment 30 days of employment
Benefit amount Flat $150,000 Flat $100,000 Flat $60,000
Maximum benefit $150,000 $100,000 $60,000
Contributions Noncontributory Noncontributory Noncontributory
Participation requirement 100.00% 100.00% 100.00%
---
Benefit amount Flat $40,000 Flat $20,000
Maximum benefit $40,000 $20,000
Compulsory coverage Yes Yes
Contributions Noncontributory Noncontributory
Waiting Period 30 days of employment 30 days of employment
Waiting Period 或 Contributions 等短语是行的标签。然后是可变数量的列,由可变数量的空格分隔。
我正在努力寻找一个可以根据标签定位特定行的正则表达式,然后提取那些可变数量的列的内容。我想我已经构建了标签标识符和捕获组来识别列。但是表达式似乎在第一次匹配时就停止了。
(?:\s*Waiting Period)(?:(?:\s{2,})(.*?)(?:\s{2,}|\n|$))
preg_match_all 中的上述表达式:
preg_match_all("/(?:\s*Waiting Period)(?:(?:\s{2,})(.*?)(?:\s{2,}|\n))/", $input_lines, $output_array);
产生:
array(2) {
0 => array(2){
0 => Waiting Period 30 days of employment
1 =>
Waiting Period 30 days of employment
}
1 => array(2){
0 => 30 days of employment
1 => 30 days of employment
}
}
如您所见,匹配根据标签正确识别目标行,提取第一列并退出。我不知道如何指示该过程继续进行,直到每个匹配的行都被处理到行尾。
我的问题是:我的正则表达式方法是否可以挽救以实现我的目标?或者,我是否误解了 preg_match_all 并且只会得到一个捕获子组的实例?
【问题讨论】:
-
那么,两个或多个空格分隔列?
-
基本上,PCRE 引擎无法捕获可变数量的组(在您的情况下为列)。因此,您必须捕获列行,然后单独解析。可能在一段时间的 find/find-next 循环中,您会使用
/^Waiting Period\h+(.*)/mg,然后在/\s{2,}/上拆分 $1 以获取列。 -
@sln:是的,2+ 个空格分隔列。我担心“可变数量的组”是不可能的。我希望我只是误解了限制并且我的正则表达式不正确。作为一个远景:你知道像 preg_match_all 这样的结构是否会给我提供全局搜索吗?
-
我认为 preg_match_all 会盲目地将每个匹配实例的捕获组放入一个数组中。所以,还是一样,不会获得可变数量的捕获组。只有 Dot-Net 在他们的
CaptureCollection类中这样做。
标签: php regex preg-match-all