Regex-防止某些字符串匹配
我在找一个银行账号。 它可以采用以下格式:Regex-防止某些字符串匹配,regex,Regex,我在找一个银行账号。 它可以采用以下格式: 或或或 第一组(#######-)如果存在,可以有1-6个数字后跟-,并且不能全部为零。它可以匹配123456-,但不能000000- 第二组()可以有2-10个数字,必须有一个非零字符 我从这个正则表达式(\d{1,6}\-)?\d{2,10}开始。它应该匹配1。二,。第二排,不是第三排。四,。这个正则表达式匹配1。2.四,。我如何排除4.,即阻止匹配000000 100000-1234567890 1234567890 -1234567890
或或或
- 第一组(
#######-
)如果存在,可以有1-6个数字后跟-
,并且不能全部为零。它可以匹配123456-
,但不能000000-
- 第二组(
)可以有2-10个数字,必须有一个非零字符
我从这个正则表达式(\d{1,6}\-)?\d{2,10}
开始。它应该匹配1。二,。第二排,不是第三排。四,。这个正则表达式匹配1。2.四,。我如何排除4.,即阻止匹配000000
100000-1234567890
1234567890
-1234567890
000000-1234567890
您可以使用具有负前瞻性的正则表达式,以确保起始处全为零的代码不匹配:
^(?:(?!0+-)\d{1,6}-)?(?=\d*[1-9])\d{2,10}$
见
这里,
^
-匹配字符串的开头
(?:(?:)(?!0+-)\d{1,6}-?
-仅当-
之前的数字不是零时(由于(?:…)?
构造),才可选地匹配1到6个数字(带有\d{1,6}
),后跟连字符(由于负前瞻(?!0+-)
)
(?=\d*[1-9])
-第二组2到10位数字应至少有一个非零位
\d{2,10}
-匹配后面跟
$
-字符串结尾
基本上,您只需要在正则表达式中添加两个内容:
- 锚定(
^
和$
)
- 展望未来
您可以使用具有负前瞻性的正则表达式,以确保起始处全零的代码不匹配:
^(?:(?!0+-)\d{1,6}-)?(?=\d*[1-9])\d{2,10}$
见
这里,
^
-匹配字符串的开头
(?:(?:)(?!0+-)\d{1,6}-?
-仅当-
之前的数字不是零时(由于(?:…)?
构造),才可选地匹配1到6个数字(带有\d{1,6}
),后跟连字符(由于负前瞻(?!0+-)
)
(?=\d*[1-9])
-第二组2到10位数字应至少有一个非零位
\d{2,10}
-匹配后面跟
$
-字符串结尾
基本上,您只需要在正则表达式中添加两个内容:
- 锚定(
^
和$
)
- 展望未来
斯特里比索的回答是“好的”。
但是,如果您想通过“前瞻”来避免头痛,您只需使用以下方法:
^(?:[1-9](?:\d{1,5})?-)?\d{2,10}$
在这里,我们只是禁止在第一组中使用首字母“0”,然后只允许使用其他5位数字
.斯特里比索的答案是“好的”。
但是,如果您想通过“前瞻”来避免头痛,您只需使用以下方法:
^(?:[1-9](?:\d{1,5})?-)?\d{2,10}$
在这里,我们只是禁止在第一组中使用首字母“0”,然后只允许使用其他5位数字
.谢谢。我尝试使用负前瞻,但没有成功。通过这个例子,我明白了。实际上,lookaheads是危险的,在大多数情况下,它们只与锚(^
/$
,\A
/\Z
/\Z
)和单词边界(\b
/\b
)一起工作。很高兴能帮上忙。@sln击败了我,但从OP开始:“第二组()(第二组)可以有2-10个数字,必须有一个非零字符”,所以您的正则表达式可能应该是((?!0+-)\d{1,6}-(?:\d{2,10}-)(?),也就是说,它与之类的东西匹配好的,没有针对这个问题的测试用例,修复并添加了两个测试用例。谢谢。我尝试使用负向前看,但没有成功。通过这个例子我明白了。实际上,向前看是危险的,在大多数情况下,它们只与锚一起工作(^
/$
,\A
/\Z
/\Z
)和单词边界(\b
/\b
)。很乐意帮忙。@sln击败了我,但从OP开始:“第二组(###########
)可以有2-10个数字,必须有一个非零字符”,所以也许你的正则表达式应该是((?!0+)\d-){1,6-){-100000d:{-1000000,就像一样。(第二组全部为零)好的,没有测试用例,修复并添加了两个测试用例。我又添加了两个测试用例:100000-0000000000
(不匹配)和100000-000000000 1
(待匹配)。我又添加了两个测试用例:100000-0000000000
(不匹配)和100000-000000000 1
(待匹配)。