2016-09-15 16 views
1

私はいくつかの情報を抽出するために動作する正規表現を持っています。 PHPのコードはfolowingさ:STRといくつかのキャプチャグループを持つ正規表現

<?php 

$re = "/(\\d{2}.\\d{2}.\\d{2}).+(\\w{3}).+\\w{3}.+(\\w{2}\\s\\d{4}).+(\\d{2}:\\d{2}\\n).+(\\d{2}.\\d{2}.\\d{2}).+(\\w{2}\\s\\d{4}).+(\\d{2}:\\d{2}\\n).+((FNC|PXO)\\d{3})/"; 
$str = "***NEUBUCHUNG ***\n 24.01.15 TXL FNC AB 2306 11:40 15:20\n 31.01.15 FNC TXL AB 2307 16:05\n FNC044 RESIDENCIAL VILA LUSITANI 9000-120 FUNCHAL\n 1 DOPPELZIMMER      FRUEHSTUECK\n SPO1101\n INKL. REISELEITUNG UND TRANSFER AB/BIS\n FLUGHAFEN\n F368966 HERR EIDAM, KLAUS    54\n F368966 FRAU EIDAM, SONJA    54"; 

$str2 = "***ÄNDERUNG ***\nNEU:11.04.15 DUS AB 2646 13:15 16:25\n 18.04.15 FNC DUS AB 2647 17:15\n FNC027 PESTANA CARLTON MADEIRA 9004-531 FUNCHAL\n 1 DO-MEERBLICK      F\nF365474 HERR PETERS, HANS        O 03.01.15\nLANGZEITERMÄSSIGUNG 10%\nSPO-JAN_SALES 20%\nFRÜHBUCHER 10%\nINKL. REISELEITUNG UND TRANSFER AB/BIS\nFLUGHAFEN\nZimmer in ruhiger Lage\n(unverbindlicher Kundenwunsch)\nNEU:\nF365474 FRAU PETERS, ULRIKE        O 03.01.15"; 

preg_match($re, $str, $matches); 
print_r($matches) 
?> 

https://ideone.com/UdIaA7

正規表現:str2を持つhttps://regex101.com/r/rF0uP7/5

正規表現:https://regex101.com/r/cV6iF9/1

それがstr2の中で一致していないstrのために完璧に動作しますが、理由を見つけることができません

答えて

1

最初の.+(\w{3})はオプションでなければなりません。 (?:.+(\w{3}))?で囲みます。

あなたはより良い \s+になっているので、ちょうど空白を一致させるためのもの、そして、あなたはほとんどの場所で、 .+あまりにも多くを持って、また regex demo

参照してください。また、リテラルドットと一致させるためのドットはエスケープする必要があります。

は、より最適化を使用します。

(\d{2}\.\d{2}\.\d{2})(?:\s+(\w{3}))?\s+\w{3}\s+(\w{2}\s\d{4}).+(\d{2}:\d{2}\n)\s+(\d{2}\.\d{2}\.\d{2}).+(\w{2}\s\d{4})\s+(\d{2}:\d{2}\n).+((FNC|PXO)\d{3}) 

を参照してください。このregex demo

+1

は(あなたがUTFテキストを扱う場合は、多分 '/ u')あなたはPHPで正規表現パターンを持つ任意の修飾子を使用するべきではありません注意してください。 ?\ s + \ w {3} \ s +(\ d {2} \ d {2} \ { (\ w {2} \ s \ d {4})+(\ d {2}:\ d {2} \ n)\ s +(\ d {2} \。\ d {2} \。\ d +(\ fP | PXO)\ d {3} \ {2} \ s \ d {2} )〜u '、$ str、$ matches) 'となります。 –

+0

あなたはマスターウィクスターです!ありがとう:) – Mary

2

しかし、それはそれはSTR2に一致していない、と私はここで

が犯人式である理由を見つける傾けるstrのために完璧に動作します:(\\w{3}).+\\w{3}

そして、$ strの中で、あなたが持っていた24.01.15 TXL FNC AB

しかし、 $のSTR2に、あなたが持っていた:11.04.15 DUS AB

あなたの正規表現は、より良いそうのように読むことができる:

$re = "#(\d{2}\.\d{2}\.\d{2})(?:\s+(\w{3}))?\s+\w{3}\s+(\w{2}\s\d{4}).+(\d{2}:\d{2}\n)\s+(\d{2}\.\d{2}\.\d{2}).+(\w{2}\s\d{4})\s+(\d{2}:\d{2}\n).+((FNC|PXO)\d{3})#si"; 

Quick-Test

関連する問題