如何在Java Regex中定义重复组?
假设一个2位数[0-9] {2}多次用分隔,
12,34,98,11
这是可能的还是唯一的机会?
编辑:我想验证并提取。
最简单的方法是使用两步解决方案: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(),因为该方法需要一个完整的字符串匹配。
s.matches("\\d{2}(?:,\\d{2})*")
,
s.split(Pattern.quote(","))
^
$
matches()
如果必须使用单个regex来执行此操作,则 只有在字符串开头的字符串检查成功的情况下,才可以在字符串的开头和每个成功的先前匹配的结尾处使用多个匹配项:
(?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$))(\d{2})
请参阅regex演示。
细节
(?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$))
\G(?!^),
|
\d{2}(?:,\d{2})*$
(\d{2})
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]