2011-02-04 100 views
3

我似乎无法使这个正则表达式的工作。正则表达式与前瞻

输入如下。它确实在一行上,但是我在每个\ r \ n之后插入了换行符,以便更容易看到,因此不需要检查空格字符。

01-03\r\n 
01-04\r\n 
TEXTONE\r\n 
STOCKHOLM\r\n 
350,00\r\n   ---- 350,00 should be the last value in the first match 
12-29\r\n 
01-03\r\n 
TEXTTWO\r\n 
COPENHAGEN\r\n 
10,80\r\n 

这可能会继续与另一个01-31和02-01,标志着另一个新的比赛(这些是日期)。

我想有一个总的2场比赛的此输入。 我的问题是我不知道如何展望未来,并匹配新比赛的开始(以下两个日期),但不包括第一场比赛中的那些日期。他们应该属于第二场比赛。

这很难解释,但我希望有人会误会我。 这是我走到这一步,但它甚至还没有接近:

(.*?)((?<=\\d{2}-\\d{2})) 

我想这些比赛:

1: 01-03\r\n01-04\r\nTEXTONE\r\nSTOCKHOLM\r\n350,00\r\n 
2: 12-29\r\n01-03\r\nTEXTTWO\r\nCOPENHAGEN\r\n10,80\r\n 

之后,我可以很容易的列与\ r \ n种分离。

+0

你是说你的输入字符串包含 “反斜杠反斜杠[R N”,而不是新行字符?这似乎很奇怪... – 2011-02-04 23:40:28

回答

2

这里的另一种选择,您可以尝试:

(.+?)(?=\d{2}-\d{2}\\r\\n\d{2}-\d{2}|$) 

Rubular

3

这个更明确的模式可以为你工作吗?

(\d{2}-\d{2})\r\n(\d{2}-\d{2})\r\n(.*)\r\n(.*)\r\n(\d+(?:,?\d+)) 
+0

这完美的作品,谢谢!我爱所以:) – Andreas 2011-02-05 00:11:58

+1

这个正则表达式需要确切的列数和最后一个是一个数字。根据我的测试数据,这是正确的,但马克的答案是现货。不管怎样,谢谢你! – Andreas 2011-02-05 00:42:49

1
/ 
    \G 
    (
     (?: 
     [0-9]{2}-[0-9]{2}\r\n 
    ){2} 
     (?: 
     (?! [0-9]{2}-[0-9]{2}\r\n) [^\n]*\n 
    )* 
    ) 
/xg 
0

为什么做这么多工作?

$string = q(01-03\r\n01-04\r\nTEXTONE\r\nSTOCKHOLM\r\n350,00\r\n12-29\r\n01-03\r\nTEXTTWO\r\nCOPENHAGEN\r\n10,80\r\n); 
for (split /(?=(?:\d{2}-\d{2}\\r\\n){2})/, $string) { 
    print join("\t", split /\\r\\n/), "\n" 
} 

输出:

01-03 01-04 TEXTONE STOCKHOLM  350,00 
12-29 01-03 TEXTTWO COPENHAGEN  10,80`