util regulares online number javatpoint expresiones example java regex

regulares - regex to java



Regex de Java: repeticiĆ³n de grupos de captura (4)

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


(^ | / 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 ` `


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:

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


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("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])"); if(words.length > 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( "<header ng-repeat-start=/"item in items/">")); System.out.println(matcher.match( "var ngRepeatStart=/"item in items/">")); }

}


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.