Использование класса символов, такого как [a-zA-Z0-9.-]+
, является довольно широким соответствием, поскольку, например, оно не гарантирует, что точка не находится в конце.Может совпадать с любым из перечисленных, так что, например, --.--
также допустимо.Обратите внимание, что вам не нужно выходить за пределы точки, а также тире, если она находится в конце.
первый шаблон (@[a-zA-Z0-9\.\-]+)
соответствует обоим, потому чтонет границ, установленных слева и справа.
Второй шаблон [^\[](@[a-zA-Z0-9\.\-]+)
совпадает, включая начальный пробел, поскольку ему соответствует отрицательный класс символов [^\[]
, который не соответствует [
Третий шаблон [^\[\s](@[a-zA-Z0-9\.\-]+)
не совпадает, потому что теперь класс отрицанных символов [^\[\s]
не позволяет найти начальный пробел.
Четвертый шаблон [^.+?](@[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);