Java使用正则表达式验证和拆分数字和符号

时间:2017-10-30 09:35:07

标签: java regex

我试图验证一个字符串,它必须以正确的顺序具有某种模式,并进一步将它们分成组。

我的预期格式为\60#######\60000000其中

  1. 必须以一个" \"
  2. 开头
  3. 跟随一个或多个数字(例如60,可以是任何数字)
  4. 跟随零或更多"#"
  5. 背后没有其他任何东西

    可能的匹配就像

    1. \ 600亿
    2. \ 60 ###
    3. \ 60 ############
    4. \ 58342 ##
    5. 所以我在下面编译正则表达式试图验证,并进一步将其分成组(期望2组(没有#)或3组(带#)):

      Pattern numPattern = Pattern.compile("(\\\\{1})|([0-9]+)|(#*)");

      我试图检测1 x \,1或更多0到9,任意数量的#。

      单元测试:

      private static void digest(String formatTxt) {
          System.out.println("Doing: " + formatTxt);
          Pattern numPattern = Pattern.compile("(\\\\{1})|([0-9]+)|(#*)");
      
          if (numPattern.matcher(formatTxt).find()) {
              System.out.println("Pattern matched!");
          }
      
          int i = 0;
          Matcher matcher = numPattern.matcher(formatTxt);
      
          while (matcher.find()) {
              i++;
              String data = matcher.group();
              System.out.println(i + ". " + data);
          }
      
          System.out.println("");
      }
      
      public static void main(String[] args) {
          digest("\\60000000000");
          digest("\\6000000000000");
          digest("\\60#########");
          digest("\\60############");
          digest("\\60############6");
          digest("\\60########A####");
          digest("\\lala60000000000");
          digest("\\60#####6######");
          digest("\\60#####6##A####");
      }
      

      结果:

      // Doing: \60000000000
      // Pattern matched!
      // 1. \
      // 2. 60000000000
      // 3. 
      // Comment: OK but not sure why is there third element
      // 
      // Doing: \6000000000000
      // Pattern matched!
      // 1. \
      // 2. 6000000000000
      // 3. 
      // Comment: OK but not sure why is there third element
      // 
      // Doing: \60#########
      // Pattern matched!
      // 1. \
      // 2. 60
      // 3. #########
      // 4. 
      // Comment: OK but not sure why is there forth element
      // 
      // Doing: \60############
      // Pattern matched!
      // 1. \
      // 2. 60
      // 3. ############
      // 4. 
      // Comment: OK but not sure why is there forth element
      // 
      // Doing: \60############6
      // Pattern matched!
      // 1. \
      // 2. 60
      // 3. ############
      // 4. 6
      // 5. 
      // Comment: Not OK because I do not want anything behind #
      // 
      // Doing: \60########A####
      // Pattern matched!
      // 1. \
      // 2. 60
      // 3. ########
      // 4. 
      // 5. ####
      // 6. 
      // Comment: Not OK because I do not want anything behind first group of #
      // 
      // Doing: \lala60000000000
      // Pattern matched!
      // 1. \
      // 2. 
      // 3. 
      // 4. 
      // 5. 
      // 6. 60000000000
      // 7. 
      // Comment: Not OK because \\ must be followed by digits
      // 
      // Doing: \60#####6######
      // Pattern matched!
      // 1. \
      // 2. 60
      // 3. #####
      // 4. 6
      // 5. ######
      // 6. 
      // Comment: Not OK because I do not want anything behind first group of #
      // 
      // Doing: \60#####6##A####
      // Pattern matched!
      // 1. \
      // 2. 60
      // 3. #####
      // 4. 6
      // 5. ##
      // 6. 
      // 7. ####
      // 8. 
      // Comment: Not OK because I do not want anything behind first group of #
      

      感谢是否有人可以指导我在正则表达式中需要更改哪些内容以便达到上述要求?

1 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

^(\\)(\d+)(#*)$

请参阅regex demo

在Java中,您可以将String rx = "(\\\\)(\\d+)(#*)"Matcher.matches一起使用。

<强>详情

  • ^ - 字符串的开头(隐含在matches()
  • (\\) - 第1组:单个反斜杠
  • (\d+) - 第2组:一个或多个数字
  • (#*) - 第3组:0 + #字符
  • $ - 字符串结尾(隐含在matches()中)。

已修复Java demo code

private static void digest(String formatTxt) {
    System.out.println("Doing: " + formatTxt);
    Pattern numPattern = Pattern.compile("(\\\\)(\\d+)(#*)");
    Matcher m = numPattern.matcher(formatTxt);
    if (m.matches()) {
        System.out.println("Pattern matched!");
        System.out.println("1. " + m.group(1));
        System.out.println("2. " + m.group(2));
        System.out.println("3. " + m.group(3));
        System.out.println("");
    }
}