На самом деле, вам также не нужна первая группа захвата ; в этом случае оно совпадает со всем совпадением, и к нему всегда можно получить доступ через $&
. Вы можете изменить все группы захвата на без захвата, добавив ?:
после вступительного слова:
/\b(?:(?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(\(?:[^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i
Эта ошибка "неверной группы" вызвана встроенными модификаторами (т. Е. (?xi)
), которые, как заметил @kirilloid, не поддерживаются в JavaScript. Джон Грубер (автор регулярного выражения) ошибся по этому поводу, так как он был о JS, поддерживающем режим свободного пробела.
Просто к вашему сведению, причина того, что вам пришлось избегать косой черты, заключается в том, что вы использовали буквально-регулярное обозначение, наиболее распространенная форма которого использует косую черту в качестве разделителя регулярных выражений. Другими словами, это язык (Ruby или JavaScript), который требует, чтобы вы экранировали этот конкретный символ, а не регулярное выражение. Некоторые языки позволяют выбирать разные разделители регулярных выражений, в то время как другие не поддерживают литералы регулярных выражений вообще.
Но это все языковые проблемы, а не проблемы регулярных выражений; само регулярное выражение работает так, как рекламируется.