2012-08-01 6 views
13

Ich versuche Javascript Split zu verwenden, um die Sätze aus einer Zeichenfolge zu erhalten, aber das Trennzeichen zB!?.Javascript RegExp zum Teilen von Text in Sätze und das Trennzeichen beibehalten

Bisher habe ich

sentences = text.split(/[\\.!?]/); 

das funktioniert aber nicht die Endung Zeichensetzung für jeden Satz enthalten (.!?).

Kennt jemand eine Möglichkeit, dies zu tun?

+1

'? 'ist auch eine spezielle Char in RegExp, so dass Sie es entkommen müssen – rgvcorley

+3

Metazeichen wie '.' und'? 'Verlieren ihre speziellen Bedeutungen innerhalb einer Zeichenklasse. Der richtige Weg, um einen Punkt ('.'), ein Ausrufezeichen ('! ') Oder ein Fragezeichen ('? ') Zu finden, ist' [.!?] '. –

Antwort

38

Sie benötigen Spiel verwenden nicht geteilt.

Versuchen Sie es.

var str = "I like turtles. Do you? Awesome! hahaha. lol!!! What's going on????"; 
var result = str.match(/[^\.!\?]+[\.!\?]+/g); 

var expect = ["I like turtles.", " Do you?", " Awesome!", " hahaha.", " lol!!!", " What's going on????"]; 
console.log(result.join(" ") === expect.join(" ")) 
console.log(result.length === 6); 
+0

Böse !! Danke vielmals. – daktau

+1

Sie können eine Teilung verwenden: 'text.split (/ \ b (?! [\? \. \!])) /'; ' \ b teilt es auf Wortgrenzen mit, der geschickte Teil ist das negative Aussehen -voraus. – bavo

+2

Die Regex ist falsch. Wenn ich Folgendes eingabe: "Phrase 1. Phrase 2. Phrase 3", wird "Phrase 3" weggeworfen. –

5

Versuchen Sie stattdessen: -

sentences = text.split(/[\\.!\?]/); 

? ist ein besonderes Zeichen in regulären Ausdrücken so entwertet werden müssen.

Leider habe ich Ihre Frage gelesen verpassen - wenn Sie Begrenzungszeichen behalten wollen, dann müssen Sie match verwenden nicht split sehen this question

+2

Nur eine kleine Anmerkung: Sonderzeichen wie '?' Müssen nicht innerhalb einer Zeichenklasse (die eckigen Klammern) maskiert werden. – JoeRocc

6

Das Folgende ist eine kleine Ergänzung Antwort auf Larrys die auch paranthetical Sätze übereinstimmen:

text.match(/\(?[^\.\?\!]+[\.!\?]\)?/g); 

angewandt auf:

text = "If he's restin', I'll wake him up! (Shouts at the cage.) 
'Ello, Mister Polly Parrot! (Owner hits the cage.) There, he moved!!!" 

ihn gibt:

["If he's restin', I'll wake him up!", " (Shouts at the cage.)", 
" 'Ello, Mister Polly Parrot!", " (Owner hits the cage.)", " There, he moved!!!"] 
+0

Irgendeine Idee, wie man das für Dezimalzahlen justiert? Z.B. "Dort hat er 99,9% bewegt !!!" –

+1

Sie haben das '+' nach der Interpunktionscharakterklasse '[.!?]' Verpasst, so dass die drei Ausrufe nach "he moved" nicht erfasst werden. – Mogsdad

Verwandte Themen