我有一个遵循以下规则的字符串:
遵循上述规则的示例字符串为:
"A42z19z037z21z" +
"B942z21z4842z" +
"C33z449z3884z68z20z"
(这是一个为外观而分解的字符串。)
我需要一个有效执行以下操作的正则表达式:
这似乎需要两个单独的正则表达式,一个用于查找“ B”的位置,然后一个用于匹配组,直到下一个大写字母为止。可以在一个正则表达式中完成吗?
编辑:
因此,使用上面的示例,匹配项将为“ 942z”,“ 21z”和“ 4842z”。
回答这个问题:您不能使用Java regex将一个捕获组与后面带有一个量词的捕获组(又称为重复捕获组)匹配并捕获多个组。
我建议使用带有-\G
基于边界的正则表达式:
([A-Z]|(?!\A)\G)(\d+z)
图案细节:
([A-Z]|(?!\A)\G)
-组1捕获大写ASCII字母或上一次成功匹配的末尾(\d+z)
-第2组捕获1个以上的数字和一个z
。这是一个Java演示:
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]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句