Regex de Java: repetición de grupos de captura

Un elemento es una lista delimitada por comas de una o más cadenas de números o caracteres, por ejemplo

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

Estoy tratando de hacer coincidir una lista entre corchetes de cero o más elementos en Java, por ejemplo

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

que debería devolver los siguientes grupos coincidentes respectivamente para el último ejemplo

 qqq,pp abc,12 30,asdf,2 

He llegado con el siguiente patrón (incorrecto)

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

que coincide solo con lo siguiente para el último ejemplo

 qqq,pp 30,asdf,2 

¿Consejos? Gracias

Está bien. No puede tener un número “variable” de grupos de captura en una expresión regular de Java. Su patrón tiene dos grupos:

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

Cada grupo contendrá el contenido de la última coincidencia para ese grupo. Es decir, abc,12 serán anulados por 30,asdf,2 .

Pregunta relacionada:

  • Expresión regular con número variable de grupos?

La solución es usar una expresión (algo así como \((.+?)\) ) Y usar matcher.find para iterar sobre las coincidencias.

Puede usar expresiones regulares como ([^,]+) en loop o simplemente str.split(",") para obtener todos los elementos a la vez. Esta versión: str.split("\\s*,\\s*") incluso permite espacios.

(^ | \ s +) (\ S *) (($ | \ s +) \ 2) + con ignorar la opción de caso / i

Ella dejó LEft leFT ahora

ejemplo aquí – 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 ` ` 

Esta puede ser la solución:

 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\">")); }

}