如何修改正则表达式限定B位仅匹配1、2、3、6数字
正则表达式修改需求与解决方案
原正则表达式
((?i)[A-Za-z]{2}((\-\d((\-([^\S\r\n]{1,2}[A-Za-z]|[A-Za-z]{1,2}[^\S\r\n])|[^\S\r\n]{1,2})\-|\-([^\S\r\n]{1,2}\-?|[A-Za-z]{1,2}\-))|[^\S\r\n]\d[^\S\r\n][A-Za-z]{2}[^\S\r\n]|[^\S\r\n]\d([^\S\r\n]{2}[A-Za-z]|[A-Za-z][^\S\r\n]{2})|[^\S\r\n]\d[A-Za-z]{1,2}[^\S\r\n]|\d([^\S\r\n][A-Za-z]{1,2}[^\S\r\n]|[A-Za-z]{1,2}[^\S\r\n]|[^\S\r\n]{1,2}|\/|[A-Za-z]{1,2}|\-))\d{6}|\/(\d((\/([A-Za-z]{1,2}[^\S\r\n]|[^\S\r\n][A-Za-z]|[^\S\r\n]{1,2})|[^\S\r\n]{1,2})\/|(\/([A-Za-z]{1,2}\/|[^\S\r\n]{1,2})|\/))\d{6}|\d{7})|[^\S\r\n](\d[^\S\r\n]{2}\d{6}|\d{7})|\-(\d\-\d{6}|\d{7})|[^\S\r\n]\d[A-Za-z]{1,2}\d{6}|\d[^\S\r\n][A-Za-z]{1,2}\d{6}|\d{7}))(?(?=[\d])$)
需求说明
该正则需匹配以下格式内容:
- AA/B/CC/DDDDDD
- AA-B-CC-DDDDDD
- AA B CC DDDDDD
各部分规则:
- AA:2个字母(不区分大小写)
- B:仅接受1位数字:1、2、3、6
- CC:2个字母(允许包含空格)
- 在
AA B CC DDDDDD格式中,若CC为c或c(单个空格加字母/字母加单个空格),则仅允许存在一个空格(如AA B C DDDDDD、AA B CDDDDDD等形式)
可匹配示例:AA1BB123456、AA/1/BB/123456等。
问题分析
你之前尝试将匹配B位的\d替换为[1,2,3,6]{1},存在两个错误:
- 字符集写法错误:
[1,2,3,6]会匹配1、,、2、3、6这几个字符,逗号也被纳入可匹配范围,导致不符合预期。 - 替换不彻底:原正则中多处存在匹配B位的
\d,仅修改部分位置会导致仍能匹配B位为4的内容。
修改后的正则表达式
((?i)[A-Za-z]{2}((\-[1236]((\-([^\S\r\n]{1,2}[A-Za-z]|[A-Za-z]{1,2}[^\S\r\n])|[^\S\r\n]{1,2})\-|\-([^\S\r\n]{1,2}\-?|[A-Za-z]{1,2}\-))|[^\S\r\n][1236][^\S\r\n][A-Za-z]{2}[^\S\r\n]|[^\S\r\n][1236]([^\S\r\n]{2}[A-Za-z]|[A-Za-z][^\S\r\n]{2})|[^\S\r\n][1236][A-Za-z]{1,2}[^\S\r\n]|[1236]([^\S\r\n][A-Za-z]{1,2}[^\S\r\n]|[A-Za-z]{1,2}[^\S\r\n]|[^\S\r\n]{1,2}|\/|[A-Za-z]{1,2}|\-))\d{6}|\/([1236]((\/([A-Za-z]{1,2}[^\S\r\n]|[^\S\r\n][A-Za-z]|[^\S\r\n]{1,2})|[^\S\r\n]{1,2})\/|(\/([A-Za-z]{1,2}\/|[^\S\r\n]{1,2})|\/))\d{6}|[1236]\d{6})|[^\S\r\n]([1236][^\S\r\n]{2}\d{6}|[1236]\d{6})|\-([1236]\-\d{6}|[1236]\d{6})|[^\S\r\n][1236][A-Za-z]{1,2}\d{6}|[1236][^\S\r\n][A-Za-z]{1,2}\d{6}|[1236]\d{6}))(?(?=[\d])$)
修改要点
- 替换所有B位匹配项:将原正则中所有对应B位的
\d统一替换为[1236],确保所有位置的B位都只能匹配1、2、3、6。 - 修正字符集写法:
[1236]表示匹配其中任意一个数字,无需添加逗号,避免引入多余可匹配字符。
内容的提问来源于stack exchange,提问作者Jiju John
相关产品推荐
相关产品推荐

