Filtrer la chaîne dans des phrases en javascript

Actuellement, je travaille sur une application qui divise une longue colonne en courts. Pour ce faire, je divise le texte entier en mots, mais pour le moment, mon regex divise aussi les nombres.

Ce que je fais, c'est ceci:

str = "This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence."; sentences = str.replace(/\.+/g,'.|').replace(/\?/g,'?|').replace(/\!/g,'!|').split("|"); 

Le résultat est:

 Array [ "This is a long string with some numbers [125.", "000,55 and 140.", "000] and an end.", " This is another sentence." ] 

Le résultat souhaité serait:

 Array [ "This is a long string with some numbers [125.000, 140.000] and an end.", "This is another sentence" ] 

Comment dois-je changer mon regex pour y parvenir? Dois-je faire attention à certains problèmes auxquels je pourrais rencontrer? Ou serait-il suffisant de rechercher ". " , "? " Et "! " ?

 str.replace(/([.?!])\s*(?=[AZ])/g, "$1|").split("|") 

Sortie:

 [ 'This is a long string with some numbers [125.000,55 and 140.000] and an end.', 'This is another sentence.' ] 

Panne:

([.?!]) = Capture non plus. ou ? ou !

\ S * = Capturez 0 ou plus de caractères d'espace blanc suivant le jeton précédent ([.?!]). Ceci explique les espaces suivant un signe de ponctuation correspondant à la grammaire de langue anglaise.

(? = [AZ]) = Les jetons précédents ne correspondent que si le prochain caractère est dans la plage AZ (capital A au capital Z). La plupart des phrases de langue anglaise commencent par une lettre majuscule. Aucune des règles antérieures ne tient compte de cela.


L'opération de remplacement utilise:

"$ 1 |

Nous avons utilisé un "groupe de capture" ([.?!]) Et nous capturons l'un de ces personnages, et le remplacer par 1 $ (le match) plus |. Donc, si nous avons capturé? Alors le remplacement serait-il?

Enfin, nous divisons les tuyaux (|) et obtenons notre résultat.


Donc, essentiellement, ce que nous disons, c'est ceci:

1) Trouvez des signes de ponctuation (un de. Ou? Ou!) Et capturez-les

2) Les ponctuations peuvent éventuellement inclure des espaces après eux.

3) Après un signe de ponctuation, je m'attends à une lettre majuscule.

Contrairement aux expressions régulières précédentes fournies, cela correspondrait à la grammaire de langue anglaise.

De là:

4) Nous remplaçons les signes de ponctuation capturés en ajoutant un tuyau (|)

5) Nous divisons les tuyaux pour créer un tableau de phrases.

 str.replace(/(\.+|\:|\!|\?)(\"*|\'*|\)*|}*|]*)(\s|\n|\r|\r\n)/gm, "$1$2|").split("|") 

Le RegExp (voir sur Debuggex ):

  • (. + |: |! | \?) = La phrase peut se terminer non seulement par ".", "!" Ou "?", Mais aussi par "…" ou ":"
  • (\ " | | ' |) * |} |] ) = La phrase peut être entourée de marques de quatation ou de parenthèses
  • (\ S | \ n | \ r | \ r \ n) = Après qu'un sentense doit être un espace ou une fin de ligne
  • G = global
  • M = multiligne

Remarques:

  • Si vous utilisez (? = [AZ]), le RegExp ne fonctionnera pas correctement dans certaines langues. Par ex. "Ü", "Č" ou "Á" ne sera pas reconnu.

Vous pouvez exploiter que la phrase suivante commence par une lettre majuscule ou un numéro.

 .*?(?:\.|!|\?)(?:(?= [A-Z0-9])|$) 

Visualisation d'expression régulière

Debuggex Demo

Il divise ce texte

 This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence. Sencenes beginning with numbers work. 10 people like that. 

Dans les phrases:

 This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence. Sencenes beginning with numbers work. 10 people like that. 

Jsfiddle

Utilisez lookahead pour éviter de remplacer le point s'il n'est pas suivi par l'espace + mot char:

 sentences = str.replace(/(?=\s*\w)\./g,'.|').replace(/\?/g,'?|').replace(/\!/g,'!|').split("|"); 

SORTIE:

 ["This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence."] 

Vous êtes plus sûr en utilisant lookahead pour vous assurer de ce qui suit après que le point n'est pas un chiffre.

 var str ="This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence." var sentences = str.replace(/\.(?!\d)/g,'.|'); console.log(sentences); 

Si vous voulez être encore plus sécurisé, vous pouvez vérifier si ce qui est derrière est aussi un chiffre, mais comme JS ne prend pas en charge le lookbehind, vous devez capturer le caractère précédent et l'utiliser dans la chaîne de remplacement.

 var str ="This is another sentence.1 is a good number" var sentences = str.replace(/\.(?!\d)|([^\d])\.(?=\d)/g,'$1.|'); console.log(sentences); 

Une solution encore plus simple est d'échapper aux points des numéros intérieurs (les remplacer par $$$$ par exemple), faire la division et ensuite disparaître les points.

Vous avez oublié de mettre '\ s' dans votre regexp.

essaye celui-là

 var str = "This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence."; var sentences = str.replace(/\.\s+/g,'.|').replace(/\?\s/g,'?|').replace(/\!\s/g,'!|').split("|"); console.log(sentences[0]); console.log(sentences[1]); 

http://jsfiddle.net/hrRrW/

Je voudrais simplement changer les cordes et mettre quelque chose entre chaque phrase. Vous m'avez dit que vous avez le droit de les modifier, de sorte qu'il sera plus facile de le faire de cette façon.

 \r\n 

En faisant cela, vous avez une chaîne à rechercher et vous n'aurez pas besoin d'utiliser ces regex complexes.

Si vous voulez le faire de manière plus difficile, j'utiliserai un regex pour chercher "." "?" "!" Suivi d'une lettre majuscule. Comme Tessi vous l'a montré.