Java正则表达式:我可以只使用一个正则表达式来匹配组吗?

时间:2016-07-31 13:35:57

标签: java regex string

我有一个符合这些规则的字符串:

  1. 添加大写字母,对整个字符串都是唯一的。
  2. 然后添加一个或多个模式组\ d + z,其中\ d是一个数字,即数字一次或多次,然后是' z'。
  3. 重复上述1和2,零次或多次。
  4. 遵循上述规则的示例字符串是:

    "A42z19z037z21z"      +
    "B942z21z4842z"       +
    "C33z449z3884z68z20z"
    

    (这是一个为外观细分的字符串。)

    我需要一个有效执行以下操作的正则表达式:

    1. 转到指定的大写字母,例如' B'
    2. 将此大写字母与下一个大写字母之间的每组\ d + z(请参阅上述规则2)相匹配。
    3. 这似乎需要两个单独的正则表达式,一个用于查找' B'的位置,然后一个用于匹配组直到下一个大写字母。这可以在一个正则表达式中完成吗?

      编辑:

      因此,使用上面的示例,匹配将是" 942z"," 21z"和" 4842z"。

2 个答案:

答案 0 :(得分:2)

回答这个问题:您无法匹配并捕获具有一个捕获组的多个组,该捕获组之后具有使用Java正则表达式的量词(也称为repeated capturing group)。

我建议使用带有基于\G的边界的正则表达式:

([A-Z]|(?!\A)\G)(\d+z)

请参阅regex demo

模式详情

  • ([A-Z]|(?!\A)\G) - 第1组捕获大写ASCII字母或上一次成功匹配结束
  • (\d+z) - 第2组捕获1位数字和z

这是Java demo

String value1 = "A42z19z037z21zB942z21z4842zC33z449z3884z68z20z";
String pattern1 = "([A-Z]|(?!\\A)\\G)(\\d+z)";
Pattern ptrn = Pattern.compile(pattern1);
Matcher matcher = ptrn.matcher(value1);
ArrayList<ArrayList<String>> result_lst = new ArrayList<ArrayList<String>>();
ArrayList<String> lst = null;
while (matcher.find()) {
    if (!matcher.group(1).equals("")) {
        if (lst != null) result_lst.add(lst);
        lst = new ArrayList<String>();
        lst.add(matcher.group(1));
    }
    else {
        lst.add(matcher.group(2));
    }
}
if (lst != null) result_lst.add(lst);
System.out.println(result_lst);

输出:[[A, 19z, 037z, 21z], [B, 21z, 4842z], [C, 449z, 3884z, 68z, 20z]]

答案 1 :(得分:-1)

尝试:

([A-Z])*([\d]+z)

组1 =大写字母,组2 =目标值