2016-09-15 2 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}) 

당신이 PHP에서 정규식 패턴 (아마도`/ u`는 UTF 텍스트를 다루는 경우) 어떤 수식을 사용하지 않아야이 regex demo

+1

참고를 참조하십시오. ? preg_match_all ('~ (\ 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 + (\ f {2} \ s \ d {4}) \ s + (\ d {2} : \ d {2} \ n) + ((FNC | PXO) \ d {3}) ~ 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.

관련 문제