Как отформатировать строку в Javascript? - PullRequest
0 голосов
/ 20 июня 2020

Я хочу отформатировать строку в Javascript. Под форматированием я имею в виду:

  • Удаление пробелов или табуляции в начале и конце строки.
  • Удаление множественных пробелы между словами в строке.
  • Создание запятых в «последовательности»

Я знаю, что могу добиться этого с помощью regex, но не могу понять как.


Сейчас:

var myString = "     Hello  , how are         you   ? ";


Как мне нужно после:

myString = "Hello, how are you?";




Я пробовал это:

var myString = "     Hello  , how are         you   ? ";
myString.replace(/^\s*|\s{2,}|\s$/, '');
console.log(myString);

Но я получаю:

Hello, how areyou?


Если знаете, помогите пожалуйста. Заранее спасибо!

Ответы [ 5 ]

1 голос
/ 21 июня 2020

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

^[ \t]*|[ \t](?=[ \t,?])|[ \t]*$

Запустите двигатель!

Javascript ' Обычный движок s выполняет следующие операции.

^            : match beginning of string
[ \t]*       : match 0+ spaces or tabs
|            : or
[ \t]        : match a space or tab
(?=[ \t,?])  : next character must be a space, tab, comma or question mark
|            : or
[ \t]*       : match 0+ spaces or tabs
$            : match end of string

(?=[ \t,?]) - это положительный прогноз .

Я предположил, что, как и в примере, все пробелы и табуляции перед вопросительными знаками (а также запятыми) необходимо удалить. Если необходимо удалить также пробелы и табуляции, предшествующие другим символам, эти символы следует добавить в класс символов [ \t,?]. Мы могли бы написать, например, [ \t,?.!:;].

Специальный символ \s, который соответствует всем пробельным символам, должен использоваться не вместо [ \t]. Это потому, что \s также соответствует символам новой строки. Если, например, строка была abc \n x , использование \s привело бы к строке abcx, тогда как использование [ \t] преобразовало бы строку в abc\nx.

1 голос
/ 20 июня 2020

Я решил вашу проблему с помощью 3 регулярных выражений, но первое выполняется с помощью уже существующего String.trim() метода JavaScript.

var myString = "     Hello  , how are         you   ? ";
myString = myString
.trim() // trim start and end
.replace(/[ \t\n]+/g, ' ') // reduce whitespace to one space
.replace(/ ([,\?\.\!\;])/g, '$1'); // remove one space before pointation characters
console.log(myString);
0 голосов
/ 21 июня 2020

Для этого я использую один раз replace.

var myString = "     Hello  , how are         you   ?    ";
myString = myString.replace(/(\s+(?=[,\.?!])|^\s+|\s+$|\s+(?=\s))/g, "")
console.log(myString);
//Expected output: "Hello, how are you?"

Код объединяет несколько регулярных выражений в одно регулярное выражение. Потому что мы хотим заменить больше места на "". Чтобы избежать неожиданного вывода, нам нужно что-то сделать со специальным случаем (с ",!?").

myString.replace(/(^\s+|\s+$)/g, ""); //same as
myString.trim();

myString.replace((\s+(?=[\.,!?])), "");
//Will only matches spaces (which following .,!?)
//So only spaces will be replace

myString.replace((\s+(?=\s)), "");
//same as with following ,.!? But this case with space

//see on the regex replaced with same that is "", so we can combine them together
myString.replace(/(\s+(?=[,\.?!])|^\s+|\s+$|\s+(?=\s))/g, "")
0 голосов
/ 20 июня 2020

Другой способ go с одним регулярным выражением:

var myString = "     Hello  , how are         you   ? ";
myString = myString.replace(/^\s+|\s+$|\s+(?![a-z])/g, '');
console.log(myString);

Демонстрация и объяснение

0 голосов
/ 20 июня 2020

let myString = "     Hello  , how are         you   ? ";

myString = myString.replace(/\s{2,}/g, ' ');
myString = myString.replace(/ [ ,]/g, ',');
myString = myString.replace(/ [ !]/g, '!');
myString = myString.replace(/ [ ?]/g, '?');
myString = myString.replace(/ [ .]/g, '.');
document.getElementById('test').innerHTML = myString.trim();
<div id='test'></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...