Проблема с обрезанием символа в регулярном выражении

Есть такое регулярное выражение /(?<!\S)@([^\s]+)[^\(]+\(([^)]+)\)/i, для превращения строки вида @user (text) в <a href="example.com/user">text</a>. Но когда строка не содержит пробела перед скобкой, то вместо нужной строки мы получаем <a href="example.com/use">text</a> (последний символ обрезается). Подскажите, пожалуйста, как такое можно исправить, т.е чтобы последний символ не обрезался?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

var regex = /(^|\s)@([^()\s]+)\s*\(([^()]+)\)/g;
var str = "Text... @user (text) text...  @user2(text2) "; // => <a href="example.com/user">text</a>
console.log(str.replace(regex, '$1<a href="example.com/$2">$3</a>'));

Так как блок просмотра назад здесь заменен (^|\s), код будет работать и в FireFox, и в IE. См. пример работы регулярного выражения.

Подробности

  • (^|\s) - Подмаска №1 ($1): начало строки или пробельный символ
  • @ - символ @
  • ([^()\s]+) - 2 ($2): один и более символов, отличных от (, ) и пробельных символов
  • \s+ - один и более пробельных символов
  • \( - символ (
  • ([^()]+) - Подмаска №3 ($3): один и более символов, отличных от круглых скобок
  • \) - скобка )
→ Ссылка