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);
- Там нет необходимости для открывающей скобки в начале.
- Пунктуация как
'...'
,'!!!'
,'!?'
и т.д. включены в предложения. - Любое количество квадратных скобок и закрывающих скобок включены. [Изменить: добавлены различные закрывающие кавычки]