Регулярное выражение, специально соответствующее формату @ first.last и ничего до или после - PullRequest
2 голосов
/ 24 июня 2019

У меня есть строка в формате some words @first.last more words @first.last.Я хочу написать регулярное выражение для выбора любой подстроки в формате @first.last, чтобы я мог заменить эту подстроку чем-то другим.Это регулярное выражение должно учитывать только подстроку @first.last и игнорировать любые символы, предшествующие символу @ или что-либо после первого пробела после last, включая этот пробел.Пример:

regex = new RegExp(/[^\[\s](@[a-zA-Z0-9\.\-]+)/im);
str = 'Hey @first.last tell [@first.last] to check this out';
str = str.replace(regex, 'Keanu');
/** str: 'Hey Keanu tell [@first.last] to check this out? **?

Регулярные выражения, которые я пробовал:

  • (@[a-zA-Z0-9\.\-]+) -> Укажет мне часть пути, но не избавится от персонажей раньше@ символ

  • [^\[](@[a-zA-Z0-9\.\-]+) -> Это регулярное выражение не выполняется, если @first.last является первой подстрокой строки, т.е.@first.last look at this не будет изменено вызовом str.replace

  • [^\[\s](@[a-zA-Z0-9\.\-]+) ->, чтобы попытаться отфильтровать начальные пробелы

  • [^.+?](@[a-zA-Z0-9\.\-]+)

Главное, что меня сбивает с толку, - это то, что нужно добавить перед (@[a-zA-Z0-9\.\-]+), чтобы убедиться, что я обнаруживаю только символ @ и символы, которые сразу же следуют за ним вформат first.last

Я ценю любую помощь и помощь.

Ответы [ 2 ]

3 голосов
/ 24 июня 2019

Использование класса символов, такого как [a-zA-Z0-9.-]+, является довольно широким соответствием, поскольку, например, оно не гарантирует, что точка не находится в конце.Может совпадать с любым из перечисленных, так что, например, --.-- также допустимо.Обратите внимание, что вам не нужно выходить за пределы точки, а также тире, если она находится в конце.

  1. первый шаблон (@[a-zA-Z0-9\.\-]+) соответствует обоим, потому чтонет границ, установленных слева и справа.

  2. Второй шаблон [^\[](@[a-zA-Z0-9\.\-]+) совпадает, включая начальный пробел, поскольку ему соответствует отрицательный класс символов [^\[], который не соответствует [

  3. Третий шаблон [^\[\s](@[a-zA-Z0-9\.\-]+) не совпадает, потому что теперь класс отрицанных символов [^\[\s] не позволяет найти начальный пробел.

  4. Четвертый шаблон [^.+?](@[a-zA-Z0-9\.\-]+) соответствует ведущему [, поскольку ему соответствует [^.+?], который не соответствует ., + или ?

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

(^|\s)@\w+\.\w+(?!\S)

Объяснение

  • (^|\s) Захват группы 1, начало строки или символ пробела
  • @\w+\.\w+ Совпадение @, затем 1+ слов символов,точка и 1+ слова (вместо \w вы также можете использовать [a-zA-Z0-9]
  • (?!\S) Утверждать, чтосправа не является символом без пробелов

При замене используйте первую группу захвата, следуя вашей замене $1Keanu

Regex demo

regex = /(^|\s)@\w+\.\w+(?!\S)/g;
str = 'Hey @first.last tell [@first.last] to check this out';
str = str.replace(regex, "$1Keanu");
console.log(str);
0 голосов
/ 24 июня 2019

Я предполагаю, что, возможно, это выражение также может работать здесь,

(\s+|^)(@[a-z0-9-]+\.[a-z0-9-]+)(\s+|$)

\s+ - это на всякий случай дополнительные пробелы, и мы просто изменили бы класс char, если пожелаем.

const regex = /(\s+|^)(@[a-z0-9-]+\.[a-z0-9-]+)(\s+|$)/gis;
const str = `some words @first.last more words @first.last
some words @first.last more words @first.last012 some other text
some words @first.last more words @first.last012\$%^&
some words@first.last more words@first.last`;
const subst = `$1Keanu$3`;
const result = str.replace(regex, subst);

console.log(result);

Пожалуйста, смотрите демо для объяснения и дополнительной информации.

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

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