2016-04-04 5 views
1

Ich versuche, einen regulären Ausdruck (implementierbar in Javascript/Node.js) zu erstellen:Regex für einen Raum oder Zeit für neuen Satz unter bestimmten Bedingungen des Hinzufügen

  • Fügen Sie ein Leerzeichen, wenn ein Buchstaben oder Zeichen (A-Z, a-z, [email protected]#$%^&*() usw. aber keine Zahl) wird gefolgt von einem Punkt, der dann von einem Großbuchstaben gefolgt wird (ohne Leerzeichen dazwischen) und/oder,
  • einen Zeitraum hinzufügen (.), wenn Auf ein Leerzeichen folgt ein einzelner Großbuchstabe (A-Z, a-z, aber NICHT eine Zahl oder ein Zeichen), sofern nicht mehr als ein Großbuchstabe wie in einem Akronym vorhanden ist, und/oder
  • Fügen Sie einen Punkt (.) hinzu, wenn auf ein Zeichen, einen Buchstaben oder eine Zahl NICHT etwas anderes folgt.

Zum Beispiel im ersten Fall:

This is a sample sentence.This is a sample new sentence. 

Sollte sich:

This is a sample sentence. This is a sample new sentence. 

Im zweiten Fall, zum Beispiel:

This is a sample sentence This is a sample new sentence. 

werden sollte:

This is a sample sentence. This is a sample new sentence. 

aber auch, im zweiten Fall:

This is a sample sentence with TEST This is a sample new sentence. 

Sollte sich:

This is a sample sentence with TEST. This is a sample new sentence. 

Im dritten Fall, zum Beispiel:

This is a sample sentence. This is a sample new sentence 

werden sollte:

This is a sample sentence. This is a sample new sentence. 

Beachten Sie die Unterschiede in der Platzierung von Punkten und Abständen für diese Beispiele, die ich suchen und ändern möchte.

Ich habe nach Varianten von diesem gesucht und einige gefunden, aber nichts, das die genauen oben aufgeführten Kriterien erfüllt. Ich mache mir zu diesem Zeitpunkt nur Sorgen um Zeiträume und Leerzeichen, nicht um andere Interpunktionszeichen, es sei denn, es gibt eine universellere Lösung, die für mehr als nur diese Fälle gelten kann. Ich möchte damit beginnen, die Grammatik in einigen Protokolldateien und anderen Bereichen zu bereinigen.

Ich entschuldige mich im Voraus, wenn dies zu kompliziert liest. Hinterlasse einen Kommentar und ich werde gerne bei Bedarf klären.

+3

Wie geht es dir, 'Ich bin gerade bei Taco Bell.' angekommen? Sollte es werden, bin ich gerade angekommen. Taco. Glocke? – roydukkey

+0

Das ist eine gute Frage. Vorläufig können wir davon ausgehen, dass diese Art von Fall nicht auftreten wird (keine einzelnen großgeschriebenen Buchstaben außer zu Beginn eines neuen Satzes). Ich kann von dort modifizieren und die Ergebnisse bei Bedarf testen. Es sei denn, es gibt eine alternative Lösung. Meistens sind die einzigen Großbuchstaben, die innerhalb eines Satzes vorkommen, Akronyme - wie TEST. Können wir das überprüfen? –

+0

Ich habe die Frage überarbeitet, um Ihre Eingabe zumindest teilweise zu adressieren. –

Antwort

0

Für den ersten Fall verwenden die mit space anzupassen und zu ersetzen folgende:

(?=\.[^\d\s]) 

Für die 2. und 3. Fällen verwenden Sie die folgende regex mit .

(?<!\.)$|(?=\s[A-Z]) 
+0

erklären downvote PLZ? –

+0

Entschieden, um eine andere Antwort zu unterstützen. – roydukkey

3

anzupassen und zu ersetzen Während ich die Standardvorbehalte gegen die Verwendung programmatischer Mittel, um mit natürlichen Sprachen herumzuspielen (die für Computer sehr komplex und schwer zu verstehen sind) einschließen sollte, ist eine Reihe von Regexen vorgesehen, die (wenn sie in der Folge in der Zeichenfolge ausgeführt werden) das tun, was Sie wollen erscheint unten.

Für das erste Szenario:

s/([^0-9.])\.([^0-9])/\1. \2/g

Für das zweite Szenario:

s/([^.]) ([A-Z][a-z])/\1. \2/g

Für das dritte Szenario:

s/([^.])$/\1./g

Um es ein wenig zu zerlegen:

s/A/B/g bedeutet "ersetzen jedes Auftreten von Regex A im Text mit B".

(A) bedeutet "capture A, so dass wir sie später wieder verwenden können" (dies als Capture-Gruppe bekannt ist).

[^0-9.] bedeutet "Übereinstimmung mit allen Zeichen, die keine numerischen Zeichen oder das Punktzeichen sind". Dies ist eine negierte Zeichenklasse.

\. entspricht dem Literalzeichen (".").

$ ist der End-of-Line-Anker - es entspricht dem Ende der Zeichenfolge.

\1 und \2 beziehen sich jeweils auf die erste und zweite Erfassungsgruppe.

Also, im Grunde, was diese Regexes tun, ist das Zeug um die Region zu erfassen, um zu ändern, dann ersetzen Sie diese Sachen plus die Region mit dem Zeug plus die Änderung.

+0

coole Art, es zu lösen. –

Verwandte Themen