¿Cuál sería una expresión regular adecuada paracoincide con un patrón de ">" o "|" ¿Tiene un mínimo de 3 apariciones como el siguiente ejemplo? Me gustaría hacer coincidir entre ">" o "|" (no ambos) en un texto dado con espaciado irregular entre ellos.
Debe coincidir
"a> b> c> d> e"
"a | b | c | d | e"
No debería coincidir
"a> b> c" (solo 2 ">")
"a | b> c | d | e" (no ">" o "|")
Código Java de muestra para probar las expresiones (solo se escapan barras invertidas)
public static void main(String[] args) {
List<String> patterns = new ArrayList<String>();
patterns.add("/((\s*\w+\s*>\s*){3,}|(\s*\w+s*\|\s*){3,})\w/g");
patterns.add("^( ([\w\s]*>){3,} | ([\w\s]*\|){3,} )[\w\s]*$");
patterns.add("/(>|\|)[^>\|]*\1[^>\|]*\1/");
patterns.add("/[\w ]*([>|])(?:[\w ]*\1){2,}[\w ]*/");
List<String> test = new ArrayList<String>();
test.add("a > b > c > d");
test.add("a >b> c> d");
test.add("a>b>c>d");
test.add("a>b>c");
for (String s : test) {
for (int i = 0; i < patterns.size(); i++) {
System.out.println(s + "[Pattern " + i + "] " + s.matches(patterns.get(i)));
}
}
}
Respuestas
1 para la respuesta № 1/(s*w+s*([>|])s*)(s*w+s*2s*){2,}w*/
Esto funciona suponiendo que necesitas un personaje (o másentre el | o> símbolos): los símbolos no se pueden mezclar de ninguna manera en la línea a la que se aplica la expresión regular. Y por supuesto se maneja el espaciado irregular. Grupos completos son capturados adicionalmente.
Aclamaciones.
1 para la respuesta № 2
/[w ]*([>|])(?:[w ]*1){2,}[w ]*/
Haga coincidir a> o a, y luego asegúrese de que aparezca dos veces más (al menos).
0 para la respuesta № 3
Puedes intentar agrupar y volver referencias.
/(>||)[^>|]*1[^>|]*1/
0 para la respuesta № 4
Después de un par de pruebas, decidí usar esta expresión regular:
((\s)*(\w)+((\s)+(\w)+)*(\s)*((>)(\s)*(\w)+((\s)+(\w)+)*(\s)*){3,})|((\s)*(\w)+((\s)+(\w)+)*(\s)*((|)(\s)*(\w)+((\s)+(\w)+)*(\s)*){3,})
para que coincida con todos esos casos de prueba:
test.add(" a > bbb > ccc > dc");//true
test.add("a > b > c > d");//true
test.add("a >b> c> d");//true
test.add("a>b>c>d");//true
test.add("a>b>c");//false
test.add("a>b>c| d >e >f");//false
test.add(">a>b>c> d >e >f");//false
test.add("<a>b>c> d >e >f");//false
test.add("a>b>c< d >e >f");//false
test.add("a>b>c> d >e >f>");//false
test.add("a b>b>c d > d >e >f> a bcd");//true,
test.add("ayse ciog > ayse ciog > ayse ciog > ayse ciog");//true
Y obteniendo resultados exitosos ahora, gracias por su ayuda.