【问题标题】:regex that covers multiple lines覆盖多行的正则表达式
【发布时间】:2016-04-27 22:26:43
【问题描述】:

我想从以下示例txt中提取数据

START
A: 567 B:345
C: 345 D:485


START
A: 345 B:267
C: 980 D:054

我正在使用这个正则表达式,但没有积极的结果:

$regex = '~'
       . '^(?P<header>.*START:.*)$'
       //. '^(.*A: \d{3} B: \d{3}.*)$'
       //. '(.*C: \d{3} D: \d{3}.*)$'
       . '~m'
;

这给了我以下结果:

Array
(
    [0] => Array
        (
            [0] =>  START:
            [header] =>     START:
            [1] =>  START:
        )

    [1] => Array
        (
            [0] =>  START:
            [header] =>     START:
            [1] =>  START:
        )

)

但是一旦我取消注释这些行

. '^(.*A: \d{3} B: \d{3}.*)$'

. '(.*C: \d{3} D: \d{3}.*)$'

我没有匹配!

如何提取这些数据?

我已尝试删除行锚^ 的开头并将行尾锚$ 更改为\n,但没有成功

一般

当我有一个数据开始行,然后是n个数据行,然后是一个数据行结束,然后是一个时,如何提取数据还是更多空行?

【问题讨论】:

  • 当你使用多行标志m时,它意味着^表示输入的开始,$表示输入的结束,而不是一行的结束。
  • @Sammitch m 修饰符:多行。导致 ^ 和 $ 匹配每行的开始/结束(不仅是字符串的开始/结束),根据:regex101.com

标签: php regex parsing pcre


【解决方案1】:

试试这个:

(START)\s+(A:\s+\d+\s+B:\d+)\s+(C:\s+\d+\s+D:\d+)

比赛:

MATCH 1
1.  [0-5]   `START`
2.  [6-18]  `A: 567 B:345`
3.  [19-31] `C: 345 D:485`
MATCH 2
1.  [34-39] `START`
2.  [40-52] `A: 345 B:267`
3.  [53-65] `C: 980 D:054`

Regex101 Demo
Ideone Demo

【讨论】:

    【解决方案2】:

    在使用修饰符 m (MULTILINE 匹配多行字符串时,您必须确保将以下换行符与 [\r\n] 匹配,或者更好地与 \R 匹配。

    对于您的输入,以下正则表达式应该可以工作:

    /^(?<header>START)$\R+^(?<line1>A:\h*\d{3}\h+B:\h*\d{3})$\R+^(?<line2>C:\h*\d{3}\h+D:\h*\d{3})$/m
    

    \R 匹配任何换行符,\h 匹配 PCRE 中的任何水平空格。

    RegEx Demo

    【讨论】:

      猜你喜欢
      • 2022-10-17
      • 1970-01-01
      • 2022-10-18
      • 2023-01-01
      • 1970-01-01
      • 2012-04-10
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多