我有一个符合这些规则的字符串:
遵循上述规则的示例字符串是:
"A42z19z037z21z" +
"B942z21z4842z" +
"C33z449z3884z68z20z"
(这是一个为外观细分的字符串。)
我需要一个有效执行以下操作的正则表达式:
这似乎需要两个单独的正则表达式,一个用于查找' B'的位置,然后一个用于匹配组直到下一个大写字母。这可以在一个正则表达式中完成吗?
编辑:
因此,使用上面的示例,匹配将是" 942z"," 21z"和" 4842z"。
答案 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 =目标值