Подтвердить что ты не робот

Разделить строку на предложения в 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"
]

Как мне изменить свое регулярное выражение для достижения этого? Нужно ли мне следить за некоторыми проблемами, с которыми я мог столкнуться? Или это было бы достаточно для поиска ". ", "? " и "! "?

4b9b3361

Ответ 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

Таким образом, у вас есть строка для поиска, и вам не нужно будет использовать это сложное регулярное выражение.

Если вы хотите сделать это, тем сложнее я буду использовать регулярное выражение для поиска "." "?" "!" озаглавленной большой буквы. Как Тесси показал тебе.