Заменить подстроку, начиная с @, используя регулярные выражения - PullRequest
0 голосов
/ 01 декабря 2018

Я новичок в Регулярных выражениях, и я часами ломал голову, чтобы решить эту проблему

let text = "My twitter handle is @emmy, I follow @jo and @pe"

Мне нужно заменить @emmy на <a href="https://twitter.com/emmy">@emmy</a>, аналогично любой другой строке, начинающейся с @ вstring.

Вот кое-что, что я придумал из поиска в Интернете и чтения документов на MDN

function linkify(text) {
  let regex = /(?:^|\W)@(\w+)(?!\w)/g;
  return text.replace(regex, function(handle) {
    return `<a href="https://twitter.com/${handle.slice(1)}>${handle}</a>`;
})
}

Проблема с этим решением состоит в том, что иногда оно пропускаетсянекоторый текст, например Ранее на этой неделе, @emmy показал лучшего ученика и посвятил Ранее на этой неделе,

Любой вклад врешение будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Я не думаю, что вам нужен обратный вызов для этой проблемы, прямая замена должна работать:

let text = "My twitter handle is @emmy, I follow @jo and @pe";
console.log(text.replace(/(^|\W)@(\w+)\b/g, '$1<a href="https://twitter.com/$2">@$2</a>'));
0 голосов
/ 01 декабря 2018

Если вы хотите использовать замену и указать функцию в качестве второго параметра, вы можете использовать 3 группы захвата для захвата соответствия перед @, самим @ и именем,

В функцию добавьте 3 параметра, которые будут соответствовать группам захвата. Затем вы можете использовать эти параметры при замене:

(^|\W)(@)(\w+)(?!\w)

Regex demo

let text = "My twitter handle is @emmy, I follow @jo and @pe";

function linkify(text) {
  let regex = /(^|\W)(@)(\w+)(?!\w)/g;
  return text.replace(regex, function(handle, p1, p2, p3) {
    return `${p1}<a href="https://twitter.com/${p3}>${p2}${p3}</a>`;
  });
};

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