【发布时间】:2019-05-06 06:56:21
【问题描述】:
我需要编写匹配以 012 开头的 11 个数字和 012 之后的两个数字不应该是 0,1 并且应该重复的模式。
例如:01244521478 为真或 01266235698 为真,01200256354 为假。我尝试了这种模式:"012(.)\\1{1}([\\d]{6}$)" 但我不知道在哪里说 012 之后不允许 0,1 。
请帮帮我
【问题讨论】:
我需要编写匹配以 012 开头的 11 个数字和 012 之后的两个数字不应该是 0,1 并且应该重复的模式。
例如:01244521478 为真或 01266235698 为真,01200256354 为假。我尝试了这种模式:"012(.)\\1{1}([\\d]{6}$)" 但我不知道在哪里说 012 之后不允许 0,1 。
请帮帮我
【问题讨论】:
您的正则表达式 012(.)\1{1}([\d]{6}$) 很好,但无法满足您的第 4 位和第 5 位数字不应为 0 或 1 且应重复要求。也不需要{1},因为它默认是隐式的。仅在花括号内的值大于一个或类似 {2} 或 {1,5} 的范围时使用它
这个正则表达式应该可以满足你的需求,
^(?=\d{11}$)012([^01])\1\d{6}$
说明:
^ --> 字符串开始(?=\d{11}$) --> 积极向前看,以确保它只包含数字并且正好是 11 位数字。为什么需要这样做,因为[^01] 否定 0 和 1,但不允许任何其他字符。012 --> 匹配 012 字面意思([^01])\1 --> 接下来的两位数字将重复,可以是除 0 和 1 以外的任何数字\d{6} --> 匹配任意六位数字$ --> 输入结束【讨论】:
在您的正则表达式中,您使用(.)\\1,它将捕获组中的任何字符并使用反向引用引用该捕获,例如也将匹配012$$521478
您可以做的是更改 (.)\\1) 以匹配从 2 到 9 的数字,例如 ([2-9])\\1。如果您没有在工具或代码中提及第二个捕获组,则可以省略第二个捕获组。 {1}可以省略,[\\d]可以写成\\d
更新后的正则表达式可能如下所示:
^012([2-9])\1\d{6}$
在 Java 中:
String regex = "^012([2-9])\\1\\d{6}$";
说明
^断言字符串的开始012 匹配字面意思([2-9])在组中捕获一个数字2-9\1 反向引用第一个捕获组\d{6} 匹配 6 位数字$断言字符串结束【讨论】: