2012-06-23 2 views
0

Это текстовое поле, где пользователь пишет текст. Я написал пример.Регулярное выражение, разделяющее длинный текст в отдельных предложениях с совпадением()

<textarea id="text">First sentence. Second sentence? Third sentence! 
Fourth sentence. 

Fifth sentence 
</textarea> 

требования уже были рассмотрены в регулярном выражении

  • сепаратор входит в элемента массива
  • последнее предложение не обязательно требует разделитель (это может закончиться с любым характером)
  • Если предложение имеет более одного разделителя char, оно включено в элемент массива. Пример: второе предложение?!? должны быть [..., "второе предложение?!?" ...]

недостающее требование (мне нужна помощь с этим) < <

Каждая новая линия должна быть представлена пустой элемент массива. Если регулярное выражение применяется, то это должно быть ответом:

["First sentence.", "Second sentence?", "Third sentence!", "", "Fourth sentence.", "", "", "Fifth sentence"] 

Вместо этого, я получаю это:

["First sentence.", "Second sentence?", "Third sentence!", "Fourth sentence.", "Fifth sentence"] 

Это регулярное выражение и матч вызова:

var tregex = /[^\r\n.!?]+(:?(:?\r\n|[\r\n]|[.!?])+|$)/gi; 
var sentences = $('#text').val().match(tregex).map($.trim); 

Любой идеи? Благодаря!

ответ

2

Я упростили это много, либо соответствует концу строки (новая строка) или предложения следуют пунктуации:

var tregex = /\n|([^\r\n.!?]+([.!?]+|$))/gim; 

Я также считаю, что m флаг для многострочного важно

+0

привет, спасибо! im тестируя его с несколькими сценариями, но он всегда возвращает ненужный пустой элемент массива в последней позиции массива. По какой-то причине он принимает \ t (tabs) как новые строки. – andufo

+0

изменение '$' на '\ n' должно исправить. Я действительно не уверен, почему я решил использовать '$' в первую очередь – matt3141

+0

работал, еще раз спасибо! – andufo

1

Вы можно использовать следующее регулярное выражение:

/((?:\S[^\.\?\!]*)[\.\?\!]*)/g 

Давайте сломаем это вниз:

«г» для флага глобального матча, то есть сохранить согласование после первого появления

Работы изнутри, (? :) является разделителем, который позволяет группе выражения, но отбрасывать согласованный результат с выхода. Мы сопоставляем \ S (без пробелов), который не содержит период, знак вопроса или восклицательный знак.

Вы заявили, что хотите сохранить эту пунктуацию, поэтому следующая часть после матча [. \ ?!] - это серия, которая содержит эти же символы пунктуации, поэтому они включены во внешние разделители. EDIT: я добавил звездочку для этого, чтобы включить любое количество знаков препинания, или вообще ничего в конце предложения.

Проверьте сопоставленные группы, используя http://www.pagecolumn.com/tool/regtest.htm или аналогичный тестер Javascript regex.

+0

Привет, на самом деле, что regex не конвертирует \ n в пустые элементы массива, и теперь третье перечисленное требование не работает вообще: s – andufo

+0

Я добавил звездочку для этого, чтобы включить любое количество знаков препинания, или вообще ничего конец предложения. –

Смежные вопросы