Java正则表达式 - 仅当长字符串中的n个数字时才允许

时间:2018-01-11 09:45:40

标签: java regex

我需要一个允许字符串的正则表达式,除非在任何一个组中有6个或更多的数字。

我目前错误的正则表达式:

^([a-zA-Z ]*)|(\d{0,5})$

匹配

teststring 12345
teststring
1234 teststring
teststring 123 teststring
test1234string

不匹配:

1234567 teststring
teststring 123456
test123456789string

我希望有人可以提供帮助。 thx guys

更新 这个正则表达式完成了这项工作:

^(?!.*\d{6}).*$

thx @WiktorStribiżew

3 个答案:

答案 0 :(得分:2)

匹配没有6个连续数字的字符串的模式是

^(?!.*\d{6}).*

regex demo is available here。如果里面有换行符,你需要添加一个DOTALL修饰符,使.匹配所有字符,包括换行符:(?s)^(?!.*\d{6}).*

<强>详情

  • ^ - 字符串的开头(隐含在matches()
  • (?!.*\d{6}) - 如果有尽可能多的字符后跟6个连续数字,则会导致匹配失败的否定前瞻
  • .* - 尽可能多的0个字符

在Java中,您可以通过以下方式使用它:

Boolean found = s.matches("(?s)(?!.*\\d{6}).*");

请注意,您可能只是尝试找到Matcher#find的6位数字,如果找不到,请继续执行代码:

if (!Pattern.compile("\\d{6}").matcher(s).find()) {
    // Cool, proceed
}

答案 1 :(得分:0)

您可以替换匹配\d{6,}的第一个组,然后检查原始长度的结果长度:

String text = "1234567 teststring";
boolean check = text.replaceFirst("\\d{6,}", "").length() == text.length();

答案 2 :(得分:0)

这个正则表达式怎么样:

this.setState(prevState => ({index: prevState.index + 1}));