2012-08-01 5 views
13

J'essaie d'utiliser le split de javascript pour extraire les phrases d'une chaîne mais garder le délimiteur par exemple!?.Javascript RegExp pour diviser le texte en phrases et garder le délimiteur

Jusqu'à présent, j'ai

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

qui fonctionne mais ne comprend pas la ponctuation de fin pour chaque phrase (.!?).

Est-ce que quelqu'un connaît un moyen de le faire?

+1

'? 'est également un caractère spécial dans RegExp, vous devez donc y échapper – rgvcorley

+3

Les méta-caractères tels que '.' et'? 'Perdent leurs significations spéciales à l'intérieur d'une classe de caractères. La bonne façon de faire correspondre un point ('.'), un point d'exclamation ('! '), Ou un point d'interrogation ('? ') Est' [.!?] '. –

Répondre

38

Vous devez utiliser match ne diviser.

essayer.

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

Wicked !! Merci beaucoup. – daktau

+1

Vous pouvez utiliser un split: 'text.split (/ \ b (?! [\? \. \!]) /);' \ b lui dit de diviser sur les limites de mot, la partie astucieuse est le look négatif -devant. – bavo

+2

L'expression rationnelle est erronée. Si je tape: "Phrase 1. Phrase 2. Phrase 3", "Phrase 3" est jetée. –

5

Essayez ceci: -

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

? est un caractère spécial dans les expressions régulières doivent donc être échappé.

Désolé me ​​manque lu votre question - si vous voulez garder délimiteurs alors vous devez utiliser match pas split voir this question

+2

Juste une petite note: les caractères spéciaux comme '?' N'ont pas besoin d'être échappés à l'intérieur d'une classe de caractères (les crochets). – JoeRocc

6

Voici un petit ajout à la réponse de Larry qui correspondra également des phrases paranthetical:

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

appliqué sur:

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!!!" 

giveth:

["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

Une idée de comment régler cela pour les nombres décimaux? Par exemple. "Là, il a déménagé à 99,9% !!!" –

+1

Vous avez manqué le '+' après la classe de caractères de ponctuation '[.!?]', Donc il ne capturera pas les trois exclamations après "il a bougé". – Mogsdad

Questions connexes