具有多个捕获组的正则表达式
Regex with several capture groups
我有一个有效的正则表达式来提取一些信息。 php代码如下:
<?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)
?>
带 str 的正则表达式:https://regex101.com/r/rF0uP7/5
带 str2 的正则表达式:https://regex101.com/r/cV6iF9/1
但是它对 str 完美工作,它在 str2 中不匹配,我找不到原因
但是它对 str 完美工作,它在 str2 中不匹配,我找不到原因
这里是 Culprit 表达式:(\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";
开头的.+(\w{3})
必须是可选的。用 (?:.+(\w{3}))?
.
包裹起来
此外,您的 .+
太多了,在大多数地方,您打算只匹配空格,因此最好变成 \s+
。此外,必须转义旨在匹配文字点的点。
使用更优化的:
(\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
我有一个有效的正则表达式来提取一些信息。 php代码如下:
<?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)
?>
带 str 的正则表达式:https://regex101.com/r/rF0uP7/5
带 str2 的正则表达式:https://regex101.com/r/cV6iF9/1
但是它对 str 完美工作,它在 str2 中不匹配,我找不到原因
但是它对 str 完美工作,它在 str2 中不匹配,我找不到原因
这里是 Culprit 表达式:(\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";
开头的.+(\w{3})
必须是可选的。用 (?:.+(\w{3}))?
.
此外,您的 .+
太多了,在大多数地方,您打算只匹配空格,因此最好变成 \s+
。此外,必须转义旨在匹配文字点的点。
使用更优化的:
(\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