Регулярное выражение Javascript для удобного форматирования пользовательского текста. - PullRequest
1 голос
/ 31 октября 2010

Я провожу исследование, чтобы найти лучший способ форматирования текстовых сообщений пользователя.

Пример того, чего я пытаюсь достичь:

1) пользователь отправляет это сообщение:

   Doctor,
I would   like to    have
an appointment tomorrow morning.Please,call me! 

2) мое приложение форматирует этот текст, выводя это:

Doctor, I would like to have an appointment tomorrow morning. Please, call me!

Обратите внимание, что:

  • пробелы в конце и в начале должны быть удалены (что-то вроде использования $.trim())
  • лишние пробелы между двумя словами должны быть заменены одним пробелом
  • новые строки, разрывные строки, табуляции, <br> должны быть заменены одним пробелом
  • точки и запятые должны быть отделены от следующего слова (утро. Пожалуйста, позвоните-> утро. Пожалуйста, позвоните)

Вот кое-что, что я получил до сих пор:

 text.replace(/<(.|\n\r)*?>/g, '')
 .replace(/\s/g,' ')
 .replace(/<br>/g,' ')
 .replace(/ +/g,' ');

Было бы хорошо объединить все выражения в один шаблон. Есть ли более короткий способ сделать это?

Ответы [ 4 ]

1 голос
/ 31 октября 2010

В двух регулярных выражениях ( jsFiddle demo ):

text.replace(/\s+|([.,])(?=\S)/g, '$1 ').replace(/^\s|\s$/g, '')

Разбив, это соответствует либо:

  • Один или несколько пробельных символов (перевод строки, табуляция, пробел)
  • Точка или запятая, за которой следует непробельный символ (для этого мы используем (?= положительный прогноз)

и заменяет его одним пробелом (ASCII 32), оставляя в любом согласованном периоде или запятой значение $ 1. Затем любой второй или последний пробельный символ удаляется во втором регулярном выражении. Второе регулярное выражение необходимо, потому что регулярное выражение, которое добавляет пробел к исходной строке, должно иметь пробел в подстроке замены, и нам нужно без пробелов в начале или конце.

Если <br> имеет значение, лучше всего заменить его пробелом перед использованием вышеуказанной пары регулярных выражений (.replace(/<br>/g, ' ')), но если вы действительно хотите сделать это в том же регулярном выражении: ( jsFiddle демо )

text.replace(/(?:<br>|\s)+|([.,])(?=\S)(?!<br>)/g, '$1 ').replace(/^\s|\s$/g, '')
0 голосов
/ 31 октября 2010

Может быть, но я не уверен, что польза от его дальнейшего снижения.Регулярные выражения уже несколько трудно читать, поэтому их логическое разбиение может быть полезно позже при отладке.

0 голосов
/ 31 октября 2010

text.replace(/\s/g,' ') заменяет любой пробел, перевод строки, вертикальную табуляцию, обычную табуляцию и пробел

.replace(/<\s*br\s*\/*\s*>/g,' ') заменяет любые <br>, < br/ >, <br /> <br /> <br //> (и т. Д.) На пробел

.replace(/\s{2,}/g,' ') заменяет любой двойной или более пробел одним пробелом

.replace(/^\s|\s$/,'') ltrim + rtrim (хотя из-за чередования, по производительности лучше разделить на отдельные ltrim и rtrims в зависимости от размера строки)

окончательный:

text = text.replace(/\s/g,' ').replace(/<\s*br\s*\/*\s*>/g,' ').replace(/\s{2,}/g,' ').replace(/^\s|\s$/,'');

Вы не можете сделать «один шаблон», потому что любой из первых двух может оставить два пробела подряд, когда они будут выполнены, поэтому вам всегда нужно иметь последнее предложение.

0 голосов
/ 31 октября 2010

Не проверял, но я считаю, что это эквивалентно:

text.replace(/^\s+|\s+$/g, '')
    .replace(/\s+|\s*<br>\s*/g,' ')

EDIT

Я не понял, почему первое выражение заменило < и >, поэтому я пропустил его.

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