小编典典

Java正则表达式:重复组?

java

如何在Java Regex中定义重复组?

假设一个2位数[0-9] {2}多次用分隔,

12,34,98,11

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

编辑:我想验证并提取。


阅读 486

收藏
2020-11-26

共1个答案

小编典典

最简单的方法是使用两步解决方案: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(","))用逗号分割该字符串。注意你不需要^$美女主播与图案内matches(),因为该方法需要一个完整的字符串匹配。

如果必须使用单个regex来执行此操作,则
只有在字符串开头的字符串检查成功的情况下,才可以在字符串的开头和每个成功的先前匹配的结尾处使用多个匹配项:

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

请参阅regex演示

细节

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

Java演示

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]
2020-11-26