正则表达式匹配:检查是否存在可选项

时间:2011-05-20 17:57:10

标签: php regex

我有数据可以是这样的:

LL DD L LL DDDD

或者喜欢:

LL DD L DDDD

其中L是字母,D是数字

DD组可以是:“1”......“9”,“10”......“99”

任意数量的空格,短划线或任何空格或其中某些空格之间没有空格。

如何在php中构建一个正则表达式来检测所有这些情况?

我正在使用它(我可以看到它并不完美):

preg_match_all('/[A-Za-z]{2}( -\.)*?\d{1,2}( -\.)*?[A-Z]{1,3}( -\.)*?\d{4}/',$file,$matches);

4 个答案:

答案 0 :(得分:1)

假设D是单个数字而L是单个字母:

$regex = '/([a-z]{2}( -\.)*[0-9]{2}( -\.)*[a-z]( -\.)*([a-z]{2}( -\.)*)?[0-9]{4})/Ui'

答案 1 :(得分:1)

我认为你想要的模式是

preg_match_all('/[a-z]{2}[ -]*\d{1,2}[ -]*[a-z]([ -]*[a-z]{2})?[ -]*\d{4}/i',$file,$matches);

匹配:两个字母,然后是任意数量的空格或短划线,后跟一个或两个数字,后跟任意数量的空格或短划线,后跟一个字母,可选地后跟(任意数量的空格或破折号,然后跟随)两个字母),后跟任意数量的空格或短划线,后跟四位数字。

/i修饰符也使其不区分大小写。

答案 2 :(得分:1)

尝试:

preg_match_all('[A-Za-z]{2}[-\s]*\d{1,2}[-\s]*[a-zA-Z][-\s]*[a-zA-Z]{2}[-\s]*\d{4}',$file,$matches);

编辑:

我的坏,我认为你的意思是空白(而不是空间)。 ff正则表达式只占用空格(而不是空格):

preg_match_all('[A-Za-z]{2}[- ]*\d{1,2}[- ]*[a-zA-Z][- ]*[a-zA-Z]{2}[- ]*\d{4}',$file,$matches);

答案 3 :(得分:0)

使用i修饰符使正则表达式不区分大小写。这会使你的正则表达式缩短一点,因为你可以写[a-z]而不是[A-Za-z]

您还可以用括号括起要提取的每个部分,然后从$matches数组中检索它们。

我的正则表达式还假设您的所有数字的位数都有所不同。因此,与DD类似,DDDD数字可以是0-9,10-99,100-999或1000-9999。

preg_match_all('/([a-z]{2})[- ]*(\d{1,2})[- ]*([a-z])[- ]*([a-z]{2})?[- ]*(\d{1,4})/i',$file,$matches);
$LL = $matches[1];
$DD = $matches[2];
//etc