【问题标题】:Regex with several capture groups具有多个捕获组的正则表达式
【发布时间】:2016-09-15 13:36:31
【问题描述】:

我有一个有效的正则表达式来提取一些信息。 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)
?>

https://ideone.com/UdIaA7

带有 str 的正则表达式:https://regex101.com/r/rF0uP7/5

带有 str2 的正则表达式:https://regex101.com/r/cV6iF9/1

但是它在str2中不匹配的str完美运行,我找不到原因

【问题讨论】:

    标签: php regex expression preg-match preg-match-all


    【解决方案1】:

    但是它在 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.

    【讨论】:

      【解决方案2】:

      开头的.+(\w{3}) 必须是可选的。用(?:.+(\w{3}))?包裹它。

      regex demo

      另外,你有太多的.+,在大多数地方,你的意思是只匹配空格,因此最好变成\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 中对正则表达式模式使用任何修饰符(如果您处理 UTF 文本,则可能是 /u)。只需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{2}).+(\w{2}\s\d{4})\s+(\d{2}:\d{2}\n).+((FNC|PXO)\d{3})~u', $str, $matches)
      • 你是维克托大师!谢谢:)
      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多