Javascript RegExp для разделения текста на предложения и сохранения разделителя

Я пытаюсь использовать разделение JavaScript, чтобы получить предложения из строки, но сохранить разделитель, например!?.

Пока у меня есть

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

который работает, но не включает конечную пунктуацию для каждого предложения (.!?).

Кто-нибудь знает способ сделать это?

6 ответов

Решение

Вам нужно использовать матч, а не разделять.

Попробуй это.

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);

Следующее является небольшим дополнением к ответу Ларри, которое будет соответствовать также и паранетическим предложениям:

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

применяется на:

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

дающий:

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

Улучшение ответа lonemc (который улучшил ответ Mia Chen, который улучшил ответ mircealungu):

Во-первых, мы можем приклеить uв конце, чтобы соответствовать символам Юникода. Другими словами, мы, вероятно, хотим иметь возможность анализировать немецкие предложения, французские предложения и т. д.

Во-вторых, вместо жесткого кодирования символов, которыми должно заканчиваться предложение, мы можем использовать «Sentence_Terminal», который является частью стандарта Unicode .

В-третьих, вместо жесткого кодирования символов, составляющих закрывающую скобку, мы можем использовать Close_Punctuation .

В-четвертых, вместо жесткого кодирования символов, составляющих закрывающую кавычку, мы можем использовать « Final_Punctuation ».

В-пятых, мы можем не захотеть сопоставлять вещи, похожие на перечисления. Например:

Это первая фраза! Это второе предложение с MyEnum.Value1, где я говорю об этом!

Для этого мы можем составить совпадение, используя шаблон просмотра вперед:

      string.match(/(?=[^])(?:\P{Sentence_Terminal}|\p{Sentence_Terminal}(?!['"`\p{Close_Punctuation}\p{Final_Punctuation}\s]))*(?:\p{Sentence_Terminal}+['"`\p{Close_Punctuation}\p{Final_Punctuation}]*|$)/guy);

Вот ссылка на регулярное выражение на Regex101.com .

Попробуйте это вместо:-

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

? это специальный символ в регулярных выражениях, поэтому его нужно экранировать.

Извините, я скучаю, прочитайте ваш вопрос - если вы хотите сохранить разделители, то вам нужно использовать match не split увидеть этот вопрос

Улучшение ответа Миа - это версия, которая также включает в себя завершающие предложения без знаков препинания:

string.match(/[^.?!]+[.!?]+[\])'"`’”]*|.+/g)

Небольшое улучшение ответа Мирцеалунгу:

string.match(/[^.?!]+[.!?]+[\])'"`’”]*/g);
  • Там нет необходимости для открывающей скобки в начале.
  • Пунктуация как '...', '!!!', '!?' и т.д. включены в предложения.
  • Любое количество квадратных скобок и закрывающих скобок включены. [Изменить: добавлены различные закрывающие кавычки]
Другие вопросы по тегам