正则表达式将匹配6个字符,只允许数字,前导和尾随空格

时间:2016-04-06 06:54:25

标签: java regex

我正在尝试实施的正则​​表达式应该匹配以下数据:

  1. 123456
  2. 12345 
  3.  23456
  4.      5
  5. 1     
  6.       
  7.   2   
  8.  2345 
  9. 不应匹配以下内容:

    1. 12 456
    2. 1234 6
    3.  1 6
    4. 1 6
    5. 总共应该是6个字符,包括数字,前导和尾随空格。它也可以是6个字符的空格。 如果使用数字,则它们之间应该没有空格。

      我尝试过以下表达无济于事:

      ^\s*[0-9]{6}$
      
      \s*[0-9]\s*
      

2 个答案:

答案 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}匹配六个字符只包含空格和/或数字的所需行。