разделение текста с совпадением JavaScript - PullRequest
0 голосов
/ 13 мая 2010

для кода ниже

var str = "I left the United States with my eyes full of tears! I knew I would miss my American friends very much.All the best to you";
var re = new RegExp("[^\.\?!]*(?:[\.\?!]+|\s$)", "g");
var myArray = str.match(re);

и вот что я получаю в результате

myArray[0] = "I left the United States with my eyes full of tears!"
myArray[1] = " I knew I would miss my American friends very much."

Я хочу добавить еще одно условие в регулярное выражение, чтобы текст разрывался только при пробел после знака препинания (? или. или!)

Я делаю так, чтобы результат для приведенного выше случая был

myArray[0] = "I left the United States with my eyes full of tears!"
myArray[1] = " I knew I would miss my American friends very much.All the best to you "
myArray[2] = ""

Ответы [ 2 ]

1 голос
/ 13 мая 2010

var str = "Я покинул Соединенные Штаты со слезами на глазах! Я знал, что буду очень скучать по своим американским друзьям. Всего вам наилучшего";

var re =/[^\.\?!]+[\.?!]( +|[^\.\?!]+)/g;
var myArray = str.match(re);
myArray.join('\n')

/*  returned value: (String)
I left the United States with my eyes full of tears! 
I knew I would miss my American friends very much.All the best to you
*/
0 голосов
/ 13 мая 2010
.+?([!?.](?= |$)|$)

должно работать.

Оно будет соответствовать любой последовательности символов, которые

  • , сопровождаются знаком пунктуации, за которым следует пробел или конец-string или
  • с последующим концом строки.

Используя квантификатор с неохотой +?, он находит кратчайшие возможные последовательности (= отдельные предложения).

В JavaScript:

result = subject.match(/.+?([!?.](?= |$)|$)/g);

РЕДАКТИРОВАНИЕ:

Чтобы избежать разбиения регулярного выражения на "пробел / одиночная буква или многозначное число / точка", вы можете использовать:

result = subject.match(/( \d+\.| [^\W\d_]\.|.)+?([!?.](?= |$)|$)/g);

Это расколется

Я покинул Соединенные Штаты со слезами на глазах!23. Я знал, что буду очень скучать по своим американским друзьям.I. Всего наилучшего вам.

в

I left the United States with my eyes full of tears!
 23. I knew I would miss my American friends very much.
 I. All the best to you.

Вместо того, чтобы просто сопоставить какой-либо символ, пока он не найдет точку, нужно:

  • Сначала попробуйте сопоставить пробел, число и точку.
  • Если это не удастся, попробуйте сопоставить пробел, букву и точку.
  • Если это не удалось,соответствует любому символу.

Таким образом, точка после числа / буквы уже сопоставлена ​​и не будет сопоставляться с символом пунктуации, следующим за следующим в регулярном выражении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...