2011-02-04 17 views
3

私はこの正規表現の仕事をすることはできません。先読み付き正規表現

入力は次のとおりです。その行は本当に1行ですが、各\ 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件のマッチがあります。 私の問題は、新しい試合の開始(2つの次の日)を先読みして一致させる方法を見つけることはできませんが、最初の試合の中にそれらの日を含めないことです。彼らは第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" を含んでいることを言って、ない改行文字されていますか?それはむしろ奇妙に思われる... –

答えて

2

ここで別のオプションは、あなたがしようとするためです:

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

Rubular

+0

これは代わりに、列のnrを気にしないか、最後のものがルーベンス正規表現のような数字でなければならないので、これを答えとしてマークしました。これは、列の数が異なり、最後の列として通貨が不思議にフォーマットされているすべてのテストデータで100%機能しました:)ありがとうございました! – Andreas

3

このより明示的なパターンはあなたに効果がありますか?

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

これは完全に動作します、ありがとう!私はSOを愛しています:) – Andreas

+1

この正規表現では列の正確なnrが必要で、最後の数は数値です。これは私のテストデータに基づいて正確でしたが、マークの答えは注目されました。とにかくありがとうございました! – Andreas

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` 
関連する問題