2016-04-27 38 views
1

我想從下面的示例中提取數據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條數據線,後跟數據線末端後跟一條或多條空行?

+1

當您使用多行標誌'M'這意味着''^表示輸入的開始和'$'表示輸入,而不是一行的末尾結束。 – Sammitch

+1

@Sammitch m修飾符:多行。導致^和$匹配每行的開始/結尾(不僅僅是字符串的開始/結束),以及根據:regex101.com – Cesar

回答

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

1

雖然匹配多行字符串與修飾符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