我正在尝试实施的正则表达式应该匹配以下数据:
123456
12345
23456
5
1
2
2345
不应匹配以下内容:
12 456
1234 6
1 6
1 6
总共应该是6个字符,包括数字,前导和尾随空格。它也可以是6个字符的空格。 如果使用数字,则它们之间应该没有空格。
我尝试过以下表达无济于事:
^\s*[0-9]{6}$
\s*[0-9]\s*
答案 0 :(得分:42)
您可以使用具有限制性 *\d* *
前瞻性的(?=.{6}$)
模式:
^(?=.{6}$) *\d* *$
请参阅regex demo
说明:
^
- 字符串开头(?=.{6}$)
- 字符串应该只有6个除换行符之外的任何字符 *
- 0 +常规空格(注意以匹配水平空格 - 使用[^\S\r\n]
)\d*
- 0+位数 *
- 0 +常规空间$
- 字符串结束。Java demo(最后4个是应该失败的测试用例):
List<String> strs = Arrays.asList("123456", "12345 ", " 23456", " 5", // good
"1 ", " ", " 2 ", " 2345 ", // good
"12 456", "1234 6", " 1 6", "1 6"); // bad
for (String str : strs)
System.out.println(str.matches("(?=.{6}$) *\\d* *"));
请注意,在String#matches()
中使用时,您不需要初始^
和最终$
锚点,因为默认情况下通过锚定模式需要完整的字符串匹配。
答案 1 :(得分:6)
你也可以这样做:
^(?!.*?\d +\d)[ \d]{6}$
零宽度否定前瞻(?!.*?\d +\d)
可确保未选中数字之间有空格的行
[ \d]{6}
匹配六个字符只包含空格和/或数字的所需行。