我正在尝试编写一个正则表达式来验证数字序列,并且正则表达式应该只包含数字 - 其中唯一的规则是数字0049不允许在序列的开头。该序列的长度也仅限于10到15个字符
示例:
0049123456789 - Must Fail
0321123456789 - Allowed to succeed
我面临的问题是,如果在字符串的前4个位置找到序列'0049',我不确定如何强制失败正则表达式。以下是我尝试过的一些模式。
使用的示例编号:0049123456789
^(^0049)|^(\d{10,15}+)$
- 与0049匹配,正则表达式验证为成功
^((?<!(0049))|(\d{10,15}+))$
- 两个正则表达式替代捕获组都成功((?<!(0049))
和(\d{10,15}+)
,将整个输入验证为成功输入
^([^0049])|^(\d{10,15}+)$
- 第二个捕获组(\d{10,15}+)
将数字组合标记为成功,因为它符合仅为数字的规则,长度为10到15个字符。
我从来没有对正则表达式有任何好处 - 我怎么能强制失败数字组合0049123456789
- 只是因为在序列的开头找到了0049
?
答案 0 :(得分:3)
Negative look提前在这里很有用
/^(?!0049)[0-9]{10,15}$/
^
将正则表达式锚定在字符串的开头。
(?!0049)
向前看负面,检查字符串的开头是 不是 0049
$
将正则表达式锚定在字符串的末尾
答案 1 :(得分:2)
您可以使用以下正则表达式:
^(?!0049)\d{10,15}$
请参阅regex demo
正则表达式细分:
^
- 字符串开头(?!0049)
- 负面预测,检查字符串开头后是否有0049
- 如果找到,不返回匹配 \d{10,15}
- 10到15位$
- 字符串结束。你的正则表达式:
^(^0049)|^(\d{10,15}+)$
- 与0049
匹配,因为您要求它与字符串开头的0049
匹配(^
中的^(^0049)
都是^((?<!(0049))|(\d{10,15}+))$
开始字符串锚点)
^((?<!(0049))
- 匹配,因为0049
表示匹配,如果字符串的开头没有^([^0049])|^(\d{10,15}+)$
[^0049]
- 匹配,因为第二个选择找到匹配,你是对的。但请注意,0
是与4
,9
和SearchRequestBuilder
匹配任何字符的否定字符类(它不会“否定”序列数字)。