3 Stimmen

Ersetzen einer Teilzeichenkette in einer Zeichenfolge, außer wenn die Zeichenfolge in Anführungszeichen steht

Regex-Dialekt: Java
Die Aufgabe: Ersetzen Sie in einer Zeichenkette alle Vorkommen einer Teilzeichenkette, außer wenn diese Vorkommen in Anführungszeichen stehen.

Beispiel 1:

string: "test substr 'test substr' substr"
substring: "substr"
replacement: "YYYY"
output: "test YYYY 'test substr' YYYY"

Beispiel2:

string: "test sstr 'test sstr' sstr"
substring: "substr"
replacement: "YYYY"
output: "test sstr 'test sstr' sstr"

Beispiel3:

string: "test 'test substr'"
substring: "substr"
replacement: "YYYY"
output: "test 'test substr'"

Dies ist mein bisher bester Versuch:

Regex: ((?:[^']*'[^']+')*?[^']*?)substring
Replace: $1replacement

Das Problem dabei ist, dass nach der letzten Zeichenkette innerhalb der Anführungszeichen eine Teilzeichenkette außerhalb der Anführungszeichen erforderlich ist, sonst funktioniert es nicht, so dass Beispiel3 fehlschlägt (Ausgabe: "test 'test YYYY'").

Vielen Dank für Ihre Hilfe.

5voto

Bart Kiers Punkte 160101

Hier ist eine Möglichkeit:

public class Main {
    public static void main(String [] args) {

        String[] tests = {
                "test substr 'test substr' substr",
                "test sstr 'test sstr' sstr",
                "test 'test substr'"
        };

        String regex = "substr(?=([^']*'[^']*')*[^']*$)";

        for(String t : tests) {
            System.out.println(t.replaceAll(regex, "YYYY"));
        }
    }
}

Drucke:

test YYYY 'test substr' YYYY
test sstr 'test sstr' sstr
test 'test substr'

Beachten Sie, dass dies nicht funktioniert, wenn ' kann mit einem \ zum Beispiel.

Eine kurze Erklärung:

Die folgenden: ([^']*'[^']*')* entspricht 0 oder einer geraden Anzahl von einfachen Anführungszeichen ohne Anführungszeichen dazwischen, und [^']*$ findet alle Nicht-Anführungszeichen und das Ende der Zeichenkette.

Die vollständige Regex ist also substr(?=([^']*'[^']*')*[^']*$) passt zu jeder "substr" die 0 oder eine gerade Anzahl von einfachen Anführungszeichen vorangestellt ist, wenn man bis zum Ende der Saite schaut!

Der Schlüssel dazu ist es, bis zum Ende der Saite zu schauen. Wenn Sie das nicht tun würden, könnten Sie die folgenden "substr" würde ebenfalls ersetzt werden:

aaa 'substr' bbb 'ccc ddd' eee
           ^     ^       ^
           |     |       |
           i     ii     iii

weil es eine gerade Anzahl von einfachen Anführungszeichen vor sich "sieht" ( i y ii ). Sie müssen ihn zwingen, die gesamte Zeichenkette rechts von ihm zu betrachten (bis zu $ )!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X