Java正则表达式:重复捕获组

项是一个或多个数字或字符串的逗号分隔列表,例如

"12" "abc" "12,abc,3" 

我正在尝试匹配Java中零个或多个项目的括号列表,例如

 "" "(12)" "(abc,12)" "(abc,12),(30,asdf)" "(qqq,pp),(abc,12),(30,asdf,2)," 

对于最后一个示例,它应分别返回以下匹配组

 qqq,pp abc,12 30,asdf,2 

我想出了以下(不正确的)模式

 \((.+?)\)(?:,\((.+?)\))* 

这与上一个示例仅匹配以下内容

 qqq,pp 30,asdf,2 

提示? 谢谢

那就对了。 您不能在Java正则表达式中拥有“可变”数量的捕获组。 您的模式有两组:

 \((.+?)\)(?:,\((.+?)\))* |___| |___| group 1 group 2 

每个组都将包含该组的最后一个匹配项的内容。 即, abc,12将被30,asdf,2覆盖。

相关问题:

  • 具有可变数量的组的正则表达式?

解决方案是使用一个表达式(类似\((.+?)\) )并使用matcher.find迭代匹配。

您可以在循环中使用正则表达式([^,]+)([^,]+)或只使用str.split(",")来一次获取所有元素。 这个版本: str.split("\\s*,\\s*")甚至允许空格。

(^ | \ s +)(\ S *)(($ | \ s +)\ 2)+ with ignore case选项/ i

她现在离开左撇子了

示例在这里 – https://regex101.com/r/FEmXui/2

 Match 1 Full match 3-23 ` left LEft leFT LEFT` Group 1. 3-4 ` ` Group 2. 4-8 `left` Group 3. 18-23 ` LEFT` Group 4. 18-19 ` ` 

这可能是解决方案:

 package com.drl.fw.sch; import java.util.regex.Pattern; public class AngularJSMatcher extends SimpleStringMatcher { Matcher delegate; public AngularJSMatcher(String lookFor){ super(lookFor); // ng-repeat int ind = lookFor.indexOf('-'); if(ind >= 0 ){ StringBuilder sb = new StringBuilder(); boolean first = true; for (String s : lookFor.split("-")){ if(first){ sb.append(s); first = false; }else{ if(s.length() >1){ sb.append(s.substring(0,1).toUpperCase()); sb.append(s.substring(1)); }else{ sb.append(s.toUpperCase()); } } } delegate = new SimpleStringMatcher(sb.toString()); }else { String words[] = lookFor.split("(? 1 ){ StringBuilder sb = new StringBuilder(); for (int i=0;i < words.length;i++) { sb.append(words[i].toLowerCase()); if(i < words.length-1) sb.append("-"); } delegate = new SimpleStringMatcher(sb.toString()); } } } @Override public boolean match(String in) { if(super.match(in)) return true; if(delegate != null && delegate.match(in)) return true; return false; } public static void main(String[] args){ String lookfor="ngRepeatStart"; Matcher matcher = new AngularJSMatcher(lookfor); System.out.println(matcher.match( "
")); System.out.println(matcher.match( "var ngRepeatStart=\"item in items\">")); }

}