2016-04-03 8 views
-2

Ein Beispieltext ist
"abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "abc", "
abc wo jede Kette von beliebiger Länge sein könnte (.*) mit Ausnahme des 4-char-string ", ".Wie ersetzt man jedes x-te Vorkommen einer Zeichenkette in einem Text mit RegEx?

Für meinen Test Fall, in dem
die Suche Nadel ist die vier Zeichen ", "
und jeder 4. Vorkommen sollte

ich mit
(([^(", ")]*", "[^(", ")]*){3})", "
und
((.*", ".*){3})", "

kam ersetzt werden Diese beiden funktionieren nicht in Notepad ++, wenn sie die Regex-Suche verwenden. (Ich sehe nur, ich habe nicht versucht, sie im Browser Scratchpad. Aber ich vermute den Fehler sowieso in meinem Regex-Begriff.)

Für den Ersatz habe ich versucht $1", \n".

Was ist der richtige Regex und der richtige Ersatz?

Bonus Frage :)
Wie zu erreichen, dass die " der Suche Nadel wird für die Zählung der nächsten 4 Vorkommen der Nadel verwendet werden?

Vielleicht eine andere Beschreibung:

addLineBreaksToLongString(a="text",b="-, -",k=3,d=3) { 
// a the String, b signal string to break at, k number of letters of b to keep on old line, d only break at every d-th occurence of b 

(ich eine Javascript-Funktion, um dies zu erreichen geschrieben haben, also keine Notwendigkeit, Zeit legte eine in der Veröffentlichung Ich möchte meine regex Schreiben verbessern, weil es viel schneller ist, zu.. Verwendung in Einzelfällen)

+0

Was genau ist falsch in Notepad ++? Das einzige, was ich an atm denken kann, ist, dass notepad ++ möglicherweise nicht entkommene Zeichen als Ersatz mag. –

+0

Warum versuchst du es nicht hier zum Beispiel: https://regex101.com/r/cU5lC2/1#javascript – John

Antwort

0

So endlich das funktioniert:

((.*?", "){3}.*?)", " 

und als Ersatz

$1", \n" 

Dies funktioniert in Notepad ++ auch.

new-line Zeichen Passend auch statt .* Verwendung [\S\s]*:

(([\S\s]*?", "){3}[\S\s]*?)", "

als .* möglicherweise nicht new-line Zeichen entspricht, auf dem Regex-Engine abhängig verwendet.

1

Diese Regex jedes vierte ", " in $ 1 erfasst.

".+?", ".+?", ".+?", ".+?(", ")

Es verwendet die faulen .+?, um sicherzustellen, dass es nicht zu viel isst.

+0

@John nächstes Mal genauer sein ... – Laurel

+0

@John Es ist hässlich, aber funktioniert jetzt. – Laurel

1

Mit Notepad ++:

Suche: (?:("[^\\"]*+(?:\\.[^\\"]*)*+"):(?1),\K){4}
ersetzen: \n

Das Muster doppelte Anführungszeichen entkam unterstützt und schneiden Sie den letzten Platz.

+1

@John: seltsam, ich habe es mit Notepad ++ (6.8.3) mit der Zeichenfolge, die Sie im Kommentar gepostet haben, getestet und es funktioniert gut. –

+1

@John, weil hier ein Leerzeichen fehlt ':" space-around "," ruby-position ":' (aber du kannst es einfach optional im Muster machen) –

Verwandte Themen