【问题标题】:PHP Regex to extract columns of text delimited by multiple spacesPHP Regex 提取由多个空格分隔的文本列
【发布时间】: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 PeriodContributions 等短语是行的标签。然后是可变数量的列,由可变数量的空格分隔。

我正在努力寻找一个可以根据标签定位特定行的正则表达式,然后提取那些可变数量的列的内容。我想我已经构建了标签标识符和捕获组来识别列。但是表达式似乎在第一次匹配时就停止了。

(?:\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


【解决方案1】:

这是因为(?:\s{2,}|\n) 有两个或多个空格或换行符。所以你的正则表达式会停止,直到它找到另一组连续的空格字符。

^\s*Waiting Period\s{2,}(.*)

DEMO

【讨论】:

  • Avinash,感谢您提供快速、简洁和正确的答案!为了我自己的澄清:我不需要尝试匹配我试图捕获的块 after 的间距,因为我已经匹配了该目标前面的空白。对吗?
  • 抱歉,需要进一步说明。看来您的更正版本确实匹配到该行的末尾。但是,行标签之后的所有内容都匹配到一个组中。我希望将每个文本块匹配到一个单独的组中。这可能吗?顺便说一句,我知道我可以在一个单独的步骤中拆分匹配的字符串,但我试图避免这个额外的步骤并将匹配项直接提取到不同的组中。谢谢!
  • @ShaheebRoshan 我需要澄清一下您发送给我的项目。你什么时候上线?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多