无法创建此类xx.xx.xxx的正则表达式, 其中x-可以是任何寄存器或数字的任何拉丁或俄语字符。但是必须有2个符号,然后点=> 2个符号=>点=> 3个字符 做出以下表达式-
var_dump(preg_match('/^([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){2}.([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){2}.([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){3}$/u', 'd1.df.dfd'));
该表达式正常工作,但是如果您在末尾删除1个字符(例如d1.df.df),则返回1,尽管应为0。请告诉我是什么问题?
答案 0 :(得分:0)
([а-я]*[А-Я]*[A-Z]*[a-z]*ё*Ё*[0-9]*){2}
模式部分匹配从а
到я
的0个或更多字母,然后匹配0+个字符А
到Я
,依此类推。匹配0次或更多次(请参见*
之后的)
量词,该量词创建了repeated capturing group,因此,捕获总是只包含空字符串)。
您需要的是将每个组内的所有字符类“合并”为单个字符类,并将限制量词应用于该类:
'~^([а-яА-ЯA-Za-zёЁ0-9]{2})\.([а-яА-ЯA-Za-zёЁ0-9]{2})\.([а-яА-ЯA-Za-zёЁ0-9]{3})$~u'
请参见regex demo
使用不区分大小写的修饰符,它会短一些:
'~^([а-яa-zё0-9]{2})\.([а-яa-zё0-9]{2})\.([а-яa-zё0-9]{3})$~ui'
此外,您可以使用子例程缩短模式:
'~^(([а-яa-zё0-9]){2})\.((?2){2})\.((?2){3})$~ui'
请参见another regex demo。这里(?2)
重复捕获组#2 ([а-яa-zё0-9])
中的模式。