C'è un modo per usare un elenco di parametri di stringa con un'espressione regolare (con gruppi) per costruire una nuova stringa?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Diciamo ad esempio che ho un'espressione regolare come questa:

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

Questa regex ha 3 componenti raggruppati: se viene confrontata con una determinata stringa, l'API regex ti consentirebbe di estrarre facilmente il valore all'interno di ciascun gruppo.

Ora diciamo che ho 3 stringhe:

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

Se assumiamo che tutti i caratteri nella regex che non sono all'interno di gruppi siano solo caratteri di testo letterali - c'è un modo per inserire ciascuna di queste 3 stringhe nel gruppo corrispondente nella regex originale, risultando in una stringa di output che combina la parte non raggruppata della regex? In questo caso, il risultato è "La volpe rossa rapida salta sopra il gatto pigro." Preferibilmente, senza la necessità di avere una stringa che abbia già abbinato la regex.

Sto cercando di farlo in Java - Sono abbastanza sicuro che java.util.regex non lo supporti, ma ho pensato che forse ci sarebbe una libreria di terze parti là fuori che potrebbe consentire che ciò venga fatto. Qualcuno può darmi alcuni suggerimenti?

È stato utile?

Soluzione

Finché puoi fare a meno dei gruppi di acquisizione nidificati, puoi semplicemente usare più regex per recuperare i letterali:

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();

Altri suggerimenti

La maggior parte delle implementazioni di regex ti consente di fare qualcosa del genere in una ricerca e sostituire:

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top