Gibt es eine Möglichkeit, eine Liste von String-Parametern mit einem regulären Ausdruck zu verwenden (mit Gruppen) eine neue Zeichenfolge zu erstellen?

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

  •  06-07-2019
  •  | 
  •  

Frage

Lassen Sie uns zum Beispiel sagen, dass ich einen regulären Ausdruck wie folgt aussehen:

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

Diese Regex hat 3 gruppiert Komponenten - wenn es gegen eine bestimmte Zeichenfolge abgestimmt ist, würde die regex api können Sie den Wert innerhalb jeder Gruppe leicht extrahieren

.

Lassen Sie uns jetzt sagen, ich habe 3 Strings:

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

Wenn wir davon ausgehen, dass alle Zeichen in der Regex, die nicht in Gruppen sind nur wörtliche Textzeichen - es gibt einen Weg jeden dieser 3-Strings in die entsprechende Gruppe in dem ursprünglichen Regex dann einzufügen, in einer Ausgabezeichenfolge führt, dass der nicht-gruppierten Teil des regulären Ausdrucks kombiniert? In diesem Fall, was in den „schnellen roten Fuchs springt über die faule Katze.“ Vorzugsweise ohne dass eine Zeichenfolge haben, die die Regex bereits abgestimmt hat.

Ich sehe dies in Java zu tun - ich bin ganz sicher, java.util.regex dies nicht unterstützt, aber ich dachte, vielleicht wäre es ein 3rd-Party-lib da draußen sein, dass dies getan wird ermöglichen konnte. Kann jemand mir einige Hinweise geben?

War es hilfreich?

Lösung

Solange Sie ohne verschachtelte Erfassung Gruppen tun können, können Sie einfach mehr Regex verwenden, um die Literale abrufen:

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

Andere Tipps

Die meisten Regex-Implementierungen können Sie so etwas wie dies in der Suche tun und ersetzen:

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top