如何编写正则表达式以从文件中选择php中的重复模式

皮特·希

使用文件中类似行的字符串,

03/21/19 11:20 LOC3 UNA:
03/21/19 11:40 LOC2 IN: NEW BD     PN  VO    LVA
03/21/19 11:50 LOC3 OFF:
03/21/19 12:20 LOC2 IN: OLD XD     AB  VO    LVA

我需要捕获石灰1中的NEW,BD,PN,VO,LVA,以及第2行中的OLD,XD,AB,VO,LVA等,而忽略其他行

这仅选择了最后一个“ VO”术语

IN:\s(([^\s]+)\s+)+.*LVA
维克多·史翠比维

您可以使用以下命令在字符串中进一步包含特定文本的特定文本之后匹配非空白文本块的出现

preg_match_all('~(?:\G(?!\A)(?=.*LVA)|IN:)\h+\K\S+~', $s, $matches)

正则表达式演示

细节

  • (?:\G(?!\A)(?=.*LVA)|IN:)-上一个匹配项的末尾(LVA除换行符外,其他字符都在0+个字符后的字符串中)或IN:子字符串(基本上,这意味着匹配后接IN:符合模式的连续子字符串,但前提是LVA稍后匹配
  • \h+ -1+水平空白
  • \K -匹配重置运算符
  • \S+ -1个以上非空白字符。

PHP的

$s = "03/21/19 11:20 LOC2 IN: NEW BD     PN  VO    LVA";
if (preg_match_all('~(?:\G(?!\A)(?=.*LVA)|IN:)\h+\K\S+~', $s, $matches)) {
    print_r($matches[0]);
}
// => Array ( [0] => NEW [1] => BD [2] => PN [3] => VO [4] => LVA )

要获得多个匹配项,请将模式包含在第一个非捕获组中并带有捕获组,然后在构建最终输出时检查子匹配项。就像是

$s = "03/21/19 11:20 LOC2 IN: NEW BD     PN  VO    LVA
03/21/19 11:20 LOC2 IN: NEW BD     PN  VO    LVA VB";
$res = [];
if (preg_match_all('~(?:\G(?!\A)(?=.*LVA)|(IN:))\h+\K\S+~', $s, $matches, PREG_SET_ORDER, 0)) {
    $tmp = [];
    foreach ($matches as $r) {
        if (count($r) > 1) {
            if (count($tmp)>0) {
                $res[] = $tmp;
                $tmp = [];
            }
        }
        $tmp[] = $r[0];
    }
    if (count($tmp)>0) {
        $res[] = $tmp;
    }
}
print_r($res);
// => Array (
//     [0] => Array ( [0] => NEW [1] => BD [2] => PN [3] => VO  [4] => A )
//     [1] => Array ( [0] => NEW [1] => BD [2] => PN [3] => VO  [4] => LVA )
// )

参见PHP演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章