排除正则表达式中的字符组合(如果找到组合,正则表达式应该失败)

时间:2015-12-02 10:48:14

标签: regex

我正在尝试编写一个正则表达式来验证数字序列,并且正则表达式应该只包含数字 - 其中唯一的规则是数字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

2 个答案:

答案 0 :(得分:3)

Negative look提前在这里很有用

/^(?!0049)[0-9]{10,15}$/
  • ^将正则表达式锚定在字符串的开头。

  • (?!0049)向前看负面,检查字符串的开头是 不是 0049

  • $将正则表达式锚定在字符串的末尾

Regex Demo

答案 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是与49SearchRequestBuilder匹配任何字符的否定字符类(它不会“否定”序列数字)。