正则表达式 - 防止某些字符串匹配

时间:2016-02-14 20:43:17

标签: regex

我正在尝试匹配银行帐号。 它可以采用以下格式: ################-##########

  • 第一组(######-)(如果存在)可以包含1-6个数字,后跟-,所有这些数字都不能为零。它可以匹配123456-但不能000000-
  • 第二组(##########)可以有2-10个数字,必须有一个没有零字符

我从这个正则表达式(\d{1,6}\-)?\d{2,10}开始。它应匹配1.和2.行,而不是3.和4.此正则表达式匹配1. 2.和4.如何排除4.,意味着阻止匹配000000

  1. 100000-1234567890
  2. 1234567890
  3. -1234567890
  4. 000000-1234567890

2 个答案:

答案 0 :(得分:3)

你可以使用带有负前瞻的正则表达式,以确保开头的全零的代码不匹配:

^(?:(?!0+-)\d{1,6}-)?(?=\d*[1-9])\d{2,10}$

请参阅regex demo

在这里,

  • ^ - 匹配字符串的开头
  • (?:(?!0+-)\d{1,6}-)? - 匹配可选(一次或零次,由于(?:...)?构造)1到6位数(带\d{1,6})后跟一个连字符如果-以外的数字不是零(由于否定前瞻(?!0+-)
  • (?=\d*[1-9]) - 第二组2到10位数字应至少有1个非零数字
  • \d{2,10} - 匹配2到10的任何数字,后跟......
  • $ - 字符串
  • 的结尾

基本上,你只需要在你的正则表达式中添加两件事:

  • 主播(^$
  • 和前瞻

答案 1 :(得分:1)

Wikitof Stribizew的回答是"""好的。
但如果你想避免头痛,你可以只使用它:

^(?:[1-9](?:\d{1,5})?-)?\d{2,10}$

这里我们只是禁止初始" 0"在第一组中,然后只允许其他5位数。

Demo here