有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java正则表达式:重复组?

如何在Java正则表达式中定义重复组

假设一个2位数[0-9]{2}乘以

12,34,98,11

这是可能的还是唯一的机会

编辑:我喜欢验证和提取


共 (3) 个答案

  1. # 1 楼答案

    在Java中,您还可以使用ScannerAPI实现以下目的:

    final Pattern pat = Pattern.compile("\\d{2}");
    Scanner scan = new Scanner("12,34,98,11");
    scan.useDelimiter(",");
    while(scan.hasNext(pat)) {
        System.out.println( "Token: " + scan.next() );
    }
    scan.close();
    
  2. # 2 楼答案

    最简单的方法是使用两步解决方案:1)首先验证字符串,然后2)使用您选择的分隔符拆分字符串:

    String[] chunks = null;
    if (s.matches("\\d{2}(?:,\\d{2})*")) {
        chunks = s.split(Pattern.quote(","));
        System.out.println(Arrays.toString(chunks)); // => [12, 34, 98, 11]
    }
    

    这里,s.matches("\\d{2}(?:,\\d{2})*")匹配以两个数字开头,然后包含0个或多个,和两个数字结尾的整个字符串,然后s.split(Pattern.quote(","))用逗号拆分字符串。注意,您不需要^$锚,因为该方法需要完全的字符串匹配

    如果必须使用单个正则表达式执行此操作,则只有在字符串开头的字符串检查成功时,才可以使用锚定到字符串开头和每个成功的前一个匹配结尾的多个匹配:

    (?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$))(\d{2})
    

    regex demo

    详细信息

    • (?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$))-前一个成功匹配的结尾,然后是字符串的开头(\G(?!^),)或(|),后跟两个数字,然后是0个或更多序列的,和字符串结尾的两个数字(参见\d{2}(?:,\d{2})*$
    • (\d{2})-第1组:两位数字

    Java demo

    String s = "12,34,98,11";
    Pattern p = Pattern.compile("(?:\\G(?!^),|^(?=\\d{2}(?:,\\d{2})*$))(\\d{2})");
    Matcher m = p.matcher(s);
    List<String> results = new ArrayList<>();
    while(m.find()) {
        results.add(m.group(1));
    }
    System.out.println(results); 
    // => [12, 34, 98, 11]
    
  3. # 3 楼答案

    这在Java正则表达式中是受支持的。见Pattern documentation。下面是一个例子:

    "11,12,13".matches("\\d{2}(,\\d{2})*"); // true
    

    然后可以使用String.split()、一个Scanner或一个StringTokenizer拆分字符串。示例:

    String[] split = "11,12,13".split(",");
    StringTokenizer stringTokenizer = new StringTokenizer("11,12,13", ",");
    Scanner scanner = new Scanner("11,12,13").useDelimiter(",");
    while (scanner.hasNext()) {
        // scanner.next()
    }