Regex удалить все начальные и конечные специальные символы? - PullRequest
0 голосов
/ 20 октября 2019

Допустим, у меня есть следующая строка в javascript:

&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&

Я хочу удалить все начальные и конечные специальные символы (все, что не является буквенно-цифровым или алфавитным на другом языке) из всех слов.

Таким образом, строка должна выглядеть следующим образом:

a.b.c a.b.c a.b.c a.b.c a.b&.c a.b.&&dc ê.b..c

Обратите внимание, как остаются специальные символы между буквенно-цифровыми цифрами. Последний ê также оставлен позади.

Ответы [ 3 ]

2 голосов
/ 20 октября 2019

Это регулярное выражение должно делать то, что вы хотите. Он ищет

  • начало строки или несколько пробелов (^| +), захваченных в группе 1
  • некоторое количество символов [!-\/:-@\[-``\{-~]*
  • минимальное числонепробельные символы ([^ ]*?), захваченные в группе 2
  • некоторое количество символов [!-\/:-@\[-``\{-~]*
  • , за которым следует пробел или конец строки (с использованием положительного взгляда) (?=\s|$)

Матчи заменяются только группами 1 и 2 (интервал и символы между символами).

let str = '&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&';
str = str.replace(/(^| +)[!-\/:-@\[-`\{-~]*([^ ]*?)[!-\/:-@\[-`\{-~]*(?=\s|$)/gi, '$1$2');
console.log(str);
1 голос
/ 20 октября 2019

a-zA-Z\u00C0-\u017F используется для захвата всех допустимых символов, включая диакритические знаки.

Ниже приводится единственное регулярное выражение для захвата каждого отдельного слова. Логика заключается в том, что он будет искать первый действительный символ в качестве начала группы захвата, а затем последнюю последовательность недопустимых символов перед пробелом или ограничителем строки в качестве конца группы захвата.

const myRegEx = /[^a-zA-Z\u00C0-\u017F]*([a-zA-Z\u00C0-\u017F].*?[a-zA-Z\u00C0-\u017F]*)[^a-zA-Z\u00C0-\u017F]*?(\s|$)/g;  
let myString = '&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&'.replace(myRegEx, '$1$2');
console.log(myString);
1 голос
/ 20 октября 2019

Как-то так может помочь:

const string = '&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&';
const result = string.split(' ').map(s => /^[^a-zA-Z0-9ê]*([\w\W]*?)[^a-zA-Z0-9ê]*$/g.exec(s)[1]).join(' ');
console.log(result);

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

Грубое объяснение: Сначала мы разбиваем строку на массив строк,разделены пробелами. Затем мы преобразуем каждую из подстрок, удаляя начальные и конечные специальные символы. Мы делаем это путем захвата всех специальных символов с помощью [^a-zA-Z0-9ê]*, поскольку из-за ведущего символа ^ он совпадает со всеми символами , за исключением из перечисленных, то есть со всеми специальными символами. Между этими двумя группами мы фиксируем все соответствующие символы с ([\w\W]*?). \w ловит слова, \W ловит не слова, поэтому \w\W ловит все возможные символы. Добавляя ? после *, мы делаем ленивый квантификатор *, так что группа перестает ловить, как только следующая группа, которая ловит висячие специальные символы, что-то ловит. Мы также начинаем регулярное выражение с символа ^ и заканчиваем его символом $, чтобы захватить всю строку (они соответственно устанавливают привязки на начало и конец строки). С .exec(s)[1] мы затем выполняем регулярное выражение для подстроки и возвращаем первый результат группы захвата в нашей функции преобразования. Обратите внимание, что это может быть нулевым, если подстрока не содержит правильных символов. В конце мы соединяем подстроки пробелами.

...