Вопрос о группах в регекспах

Я взял regexp из современного учебника по JavaScript:
Например, мы хотим найти в тексте ссылки вида <a href="..." class="doc"> , с любым содержанием href .

var reg = /<a href="[^"]*" class="doc">/g;
alert( str1.match(reg) );

У меня он тоже работает. Теперь я пытаюсь заменить ссылку в тегах:

console.log(
  decodedContent.replace(
    /(<a href=)"[^"]*"( class="doc">)/g,
    '$1"http://google.com"$2'
  )
);

Мой регксп цепляет весь текст (хоть и заменяет содержимое ссылки).


Вопрос: почему регексп цепляет весь текст?

Вроде бы понял. Это специфика работы метода replace, он не просто ищет совпадение, а производит замену.

Вопрос другой: почему регексп цепляет только первые буквы названий?

"Java JavaScript PHP C++ C C# Perl6".match(/\b[A-Z][a-zA-Z0-9\+#]*\b/g)

\b - это word boundary символ. С его точки зрения C++ - это 2 слова. "Java JavaScript PHP C++ C C# Perl6".split(/\b/g).

Regexp будет работать как ты ожидаешь если убрать последний \b. "Java JavaScript PHP C++ C C# Perl6".match(/\b[A-Z][a-zA-Z0-9\+\#]*/g)

1 лайк

Нет, не потому он цеплял только первые буквы! Этот чудак, который пишет перезаписал файлы из папки в другую, а live-server “шурует” по старой схеме и ищет их, работает со старой версией.
PS тот регексп верный.

Я подумал о том что для “C++” и “C#” зацелил только буквы C

1 лайк

Похоже, что \b шарпы в слово не учел

Вот так

"Java JavaScript PHP C++ C C# Perl6".match(/\b[A-Z][a-zA-Z0-9+#]*\s?/g)

можно, а потом truncate пробелы.