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.