代码之家  ›  专栏  ›  技术社区  ›  502_Geek

如何在preg_match中添加可选的验证模式?

  •  0
  • 502_Geek  · 技术社区  · 6 年前

    我正在尝试使用 preg_match 来解析行。但是,无法正确获得结果。

    我想用可选的 //

    基本思想是有些行可能包含//0016OIXXXXXX(//4位和9个str),有些行可能不包含(//4位和9个str)。

    \n 这是强制性的。

    以下是一些示例线;

    1812121212DD2220,31NTRFNONREF 502?102330

    第2行

    1811091109CD20693,12NTRFRMSOIC110871941//0016RFXXXXXXX 206?000801

    /(\d{6})((\d{2})(\d{2}))?(C|D)([A-Z]?)([0-9,]{1,15})([A-Z]{1,4})([A-Z a-z 0-9]{1,16})(\/\/)([0-9A-Z]{1,16})(\s*\n)([0-9]{1,3})(\?)([0-9]{0,6})/

    目前的模式只能与 // . 如果没有 //

    我不知道该怎么加 (\/\/)([0-9A-Z]{1,16})

    提前谢谢 :)

    2 回复  |  直到 6 年前
        1
  •  1
  •   user8554313 user8554313    6 年前

    如果我对你的问题理解正确的话。

    请尝试使用 or 组之间的表达式,并验证您的任何案例。 例如

    `(pattern1) | (pattern-2) | ( (pattern3) | (pattern 4)  )`
    

    请试着考虑使用 | 表示

        2
  •  1
  •   Toto    6 年前

    只要把可选部分做好。。。可选:

    \d{6}(?:\d{4})?[CD][A-Z]?[0-9,]{1,15}[A-Z]{1,4}[A-Za-z0-9 ]{1,16}(?:\/\/[0-9A-Z]{1,16})?\s*\n[0-9]{1,3}\?[0-9]{0,6}
    //                                                               ^^^^^^^^^^^^^^^^^^^^^^^
    

    如果您真的想保留它们,我已经删除了可执行性捕获组:

    (\d{6})((\d{2})(\d{2}))?(C|D)([A-Z]?)([0-9,]{1,15})([A-Z]{1,4})([A-Za-z0-9 ]{1,16})(?:(\/\/)([0-9A-Z]{1,16}))?(\s*\n)([0-9]{1,3})(\?)([0-9]{0,6})
    

    DEMO