Разделить строку на предложения в javascript
В настоящее время я работаю над приложением, которое разбивает длинный столбец на короткие. Для этого я разбил весь текст на слова, но в настоящее время мое регулярное выражение также разделяет числа.
Что я делаю:
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("|");
Результат:
Array [
"This is a long string with some numbers [125.",
"000,55 and 140.",
"000] and an end.",
" This is another sentence."
]
Желаемый результат:
Array [
"This is a long string with some numbers [125.000, 140.000] and an end.",
"This is another sentence"
]
Как мне изменить свое регулярное выражение для достижения этого? Нужно ли мне следить за некоторыми проблемами, с которыми я мог столкнуться? Или это было бы достаточно для поиска ". "
, "? "
и "! "
?
Ответы
Ответ 1
str.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|")
Вывод:
[ 'This is a long string with some numbers [125.000,55 and 140.000] and an end.',
'This is another sentence.' ]
Структура:
([.?!])
= Захватить либо .
, либо ?
или !
\s*
= Захват 0 или более символов пробела, следующих за предыдущим токеном ([.?!])
. Это означает пробелы, следующие за знаками пунктуации, которые соответствуют грамматике английского языка.
(?=[A-Z])
= Предыдущие токены соответствуют только следующему символу в диапазоне A-Z (капитал A в капитал Z). Большинство предложений на английском языке начинаются с заглавной буквы. Это не учитывает ни одно из предыдущих регулярных выражений.
В операции замены используется:
"$1|"
Мы использовали одну "группу захвата" ([.?!])
, и мы захватили один из этих символов и заменили ее на $1
(совпадение) плюс |
. Итак, если мы захватили ?
, то замена будет ?|
.
Наконец, мы разделим трубы |
и получим наш результат.
Итак, по сути, мы говорим следующее:
1) Найдите знаки препинания (один из .
или ?
или !
) и запишите их
2) Знаки препинания могут необязательно включать пробелы после них.
3) После знака препинания я ожидаю заглавную букву.
В отличие от предыдущих регулярных выражений, это соответствовало бы грамматике английского языка.
Оттуда:
4) Мы заменяем отмеченные знаки препинания, добавляя трубку |
5) Разбиваем каналы для создания массива предложений.
Ответ 2
str.replace(/(\.+|\:|\!|\?)(\"*|\'*|\)*|}*|]*)(\s|\n|\r|\r\n)/gm, "$1$2|").split("|")
RegExp (см. Debuggex):
- (. + |: |! | \?) = Предложение может закончиться не только ".", "!" или "?", но также "..." или ":"
- (\ "|\'|) * |} |]) = Предложение может быть окружено квадратами или скобками
- (\ s |\n |\r |\r\n) = После того, как sentense должно быть пробелом или концом строки
- g = global
- m = многострочный
Примечания:
- Если вы используете (? = [A-Z]), RegExp будет работать некорректно на некоторых языках. Например. "Ü", "Č" или "Á" не будут распознаны.
Ответ 3
Вы можете использовать, что следующее предложение начинается с прописной буквы или числа.
.*?(?:\.|!|\?)(?:(?= [A-Z0-9])|$)
![Regular expression visualization]()
Демоверсия Debuggex
Он разбивает этот текст
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.
в предложения:
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
Ответ 4
Используйте lookahead, чтобы избежать замены точки, если не следует пробел + слово char:
sentences = str.replace(/(?=\s*\w)\./g,'.|').replace(/\?/g,'?|').replace(/\!/g,'!|').split("|");
ВЫВОД:
["This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence."]
Ответ 5
Вы более безопасны с помощью lookahead, чтобы убедиться в том, что следует после того, как точка не является цифрой.
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);
Если вы хотите быть еще более безопасным, вы можете проверить, не отстает ли цифра, но поскольку JS не поддерживает lookbehind, вам нужно захватить предыдущий символ и использовать его в строке замены.
var str ="This is another sentence.1 is a good number"
var sentences = str.replace(/\.(?!\d)|([^\d])\.(?=\d)/g,'$1.|');
console.log(sentences);
Еще более простое решение состоит в том, чтобы избежать точек внутри чисел (например, заменить их на $$$$), выполнить разделение и впоследствии удалить всплывающие окна.
Ответ 6
вы забыли поместить '\ s' в ваше регулярное выражение.
попробуйте этот
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/
Ответ 7
Я бы просто изменил строки и поместил что-то между каждым предложением.
Вы сказали, что имеете право изменить их, поэтому будет легче сделать это таким образом.
\r\n
Таким образом, у вас есть строка для поиска, и вам не нужно будет использовать это сложное регулярное выражение.
Если вы хотите сделать это, тем сложнее я буду использовать регулярное выражение для поиска "." "?" "!" озаглавленной большой буквы. Как Тесси показал тебе.