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

时间:2018-12-12 03:41:37

标签: php preg-match

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

我想用可选的//字符来解析这些行。

基本思路是,某些行可能包含// 0016OIXXXXXXX(// 4位数字和9个字符),而某些行可能不包含(// 4位数字和9个字符)。

下一行\n是必填项。

这里有一些示例行;

第1行

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})/

当前的专利只能与//一起使用。如果没有//,则patten损坏并且无法解析该行。

我不知道应该如何添加(\/\/)([0-9A-Z]{1,16})作为可选的模板。

预先感谢 :)

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您的问题是否正确。

请尝试在组之间使用or表达式并验证您的大小写。 例如

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

请尝试考虑使用|表达式。

答案 1 :(得分:1)

只需将可选部分做好...可选:

\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