2016-08-14 1 views
0

Meinen Eingang:Finden Sie alle CR oder LF (einfach eingeben) zwischen doppelten Anführungszeichen in regex

2, Indien, "i jetzt anmelden und
bitte
mich leiten, danke", + 91547854221


Meine Anforderung ist, finde alle CR oder LF (einfach eingeben) zwischen "....." in Einzelaufnahme.

Erforderliche Leistung:

2, Indien, "ich heute kommen, und bitte leite mich, danke", + 91547854221


Ich habe Regex für diese. aber es wird nur ein CR oder LF gleichzeitig finden, aber ich möchte alle CR LF in Einzelaufnahme, aber nicht in Mehrfachaufnahme finden.

Meine regex:

(\ ") (\,?!) ([^" (\ N | \ r) ([^ "] \?") ----] ?) > ($ 3 CR oder LF, i mit Platz ersetzt) ​​

ersetzen: 1 $ $ 2 4

$ Was iam bekommen:

2, Indien, "ich heute kommen, und bitte
mich leiten Danke ", + 91547854221

+0

Sie müssen dies in ein paar Schritten tun. Der erste Schritt besteht darin, eine gerade Anzahl von doppelten Anführungszeichen zu validieren, bevor Sie mit dem Ersetzungsschritt beginnen, z. wenn es mit '^ [^"] * (?: "[^"] * "[^"] *) * $ 'besteht, dann müssen Sie alle zitierten Einträge finden und blind alle CRLFs ersetzen. Sie können einen Callback oder verwenden Benutze einfach die Suche und remainiere eine neue Zeichenkette.Wenn eine globale Ersetzung durch Callback erfolgt, benutze einfach '(" [^ "] *") ', dann im Callback, blind '' '' '\' '' '' mit nichts, dann zurück die Ergebnisse. Es ist etwas komplizierter, wenn doppelte Anführungszeichen in doppelte Anführungszeichen gesetzt werden können. – sln

+0

ist es schwer für mich zu verstehen, kannst du es bitte klar mit jedem einzelnen Schritt erklären. – kiran

+0

Ich habe es tatsächlich klar in meinem Kommentar erklärt, aber ich werde es nochmal versuchen. ** Schritt 1: ** Validiere eine gerade Anzahl von Anführungszeichen in der Datei. Eine einfache, wenn suche '^ [^ "] * (?:" [^ "] *" [^ "] *) * $' gehe dann zum nächsten Schritt. ** Schritt 2: ** Benutze einen _nested_ replace Das äußere replace '(" [^ "] *") 'entfernt bei jeder Übereinstimmung _all_ CR oder LF's von $ 1 (inneres Ersetzen) und gibt dann diese Zeichenkette an die äußere Ersetzung zurück. ** Dies kann auch erreicht werden, indem man die csv-Zeichenfolge von Grund auf neu schreibt: ** Finde in einer Schleife global '([^"] *) ("[^"] * "| $)'. Fügen Sie $ 1 an die neue Zeichenfolge an. Ersetze blind alle CR, LF's von $ 2, füge das an die neue Zeichenkette an. – sln

Antwort

0

Sie können versuchen [\n\r](?=(?:(?:[^"]*"){2})*[^"]*"[^"]*$) (durch nichts oder Leerzeichen ersetzen). Dies entspricht \n oder \r nur, wenn eine ungerade Anzahl von doppelten Anführungszeichen folgt ".

+0

was bedeutet mit {2}, die Anzahl von \ n oder \ r sind nicht festgelegt, manchmal können sie 3 und ein anderes Mal 10 sein. Also kann ich nicht nur diese Anzahl von \ n oder \ r sagen wird die ganze Zeit kommen. Ich möchte Regex, die eine beliebige Anzahl von \ r oder \ n finden. Danke für die Wiederholung. – kiran

+0

ich habe versucht, Ihre Regex, es funktioniert in einer kleinen Anzahl von Zeilen sagen 3 bis 10, aber wenn die Anzahl der Zeilen erhöht dann kann es nicht ersetzen, können Sie die Regex, die auf Millionen von Datensätzen in einer CSV-Datei verwendet werden können. Vielen Dank. – kiran

+0

@kiran - Rawings Regex findet einen Zeilenumbruch und überprüft dann, ob es eine _unive_Anzahl von Anführungszeichen gibt. Dies bedeutet, dass der Zeilenumbruch zwischen einer Reihe von Anführungszeichen liegt (in einer ordnungsgemäß ausbalancierten CSV-Datei). Dies funktioniert für eine kleine Anzahl von Zeilen, aber der Performance-Hit ist _ exponential_. Alles über ein paar hundert Zeilen und du wartest lange. – sln

Verwandte Themen