¿Hay alguna manera de usar una lista de parámetros de cadena con una expresión regular (con grupos) para construir una nueva cadena?

StackOverflow https://stackoverflow.com/questions/1814036

  •  06-07-2019
  •  | 
  •  

Pregunta

Digamos, por ejemplo, que tengo una expresión regular como esta:

"The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)."

Esta expresión regular tiene 3 componentes agrupados: si coincide con una cadena dada, la API de expresiones regulares le permitirá extraer fácilmente el valor dentro de cada grupo.

Ahora digamos que tengo 3 cadenas:

["red", "leaps","cat"]

Si suponemos que todos los caracteres de la expresión regular que no están dentro de los grupos son solo caracteres de texto literal, ¿hay alguna manera de insertar cada una de esas 3 cadenas en el grupo correspondiente en la expresión regular original, lo que resulta en una cadena de salida que combina la porción no agrupada de la expresión regular? En este caso, resulta en "El rápido zorro rojo salta sobre el gato perezoso". Preferiblemente, sin necesidad de tener una cadena que ya coincida con la expresión regular.

Estoy buscando hacer esto en Java: estoy bastante seguro de que java.util.regex no es compatible con esto, pero pensé que tal vez habría una biblioteca de terceros que podría permitirlo. ¿Alguien puede darme algunos consejos?

¿Fue útil?

Solución

Mientras pueda prescindir de grupos de captura anidados, simplemente puede usar más expresiones regulares para recuperar los literales:

String[] strings = new String[] { "red", "leaps", "dog" };
String[] literals = new String("The quick (red|brown|blue|yellow) fox " +
    "(jumps|leaps) over the lazy (dog|cat).").split("(?=[^\\\\])\\(.*?\\)");

StringBuilder sb = new StringBuilder(literals[0]);
for(int i = 0; i < strings.length; i++) {
    sb.append(strings[i]);
    sb.append(literals[i + 1]);
}

// => sb.toString();

Otros consejos

La mayoría de las implementaciones de expresiones regulares le permiten hacer algo como esto en una búsqueda y reemplazar:

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top