我有数据可以是这样的:
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);
答案 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