Как исправить ошибку «неверная группа» при попытке использовать «улучшенный» Gruber-шаблон сопоставления URL-адресов в JavaScript? - PullRequest
7 голосов
/ 24 августа 2010

Я пытаюсь интегрировать Улучшенный шаблон точного регулярного выражения Джона Грубера для сопоставления URL в один из моих Javascripts, но инспектор WebKit (в Google Chrome 5.0.375.125 для Mac) выдает «Недопустимый». группа "Ошибка синтаксиса регулярного выражения.

Оригинальное регулярное выражение Грубера выглядит следующим образом:

(?i)\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`!()\[\]{};:'".,<>?«»“”‘’]))

Строка из моего JavaScript с регулярным выражением выглядит следующим образом (с косой чертой, обратной косой чертой):

tweet_text = tweet_text.replace(/(?i)\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`!()\[\]{};:'".,<>?«»“”‘’]))/gi, '<a href="$1">$1</a>');

А ошибка Google Chrome (V8?) Выглядит следующим образом:

Uncaught SyntaxError: Invalid regular expression: /(?i)\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`!()\[\]{};:'".,<>?«»“”‘’]))/: Invalid group

И ошибка Safari выглядит следующим образом:

SyntaxError: Invalid regular expression: unrecognized character after (?

Он утверждает, что он должен работать в современных интерпретаторах регулярных выражений JavaScript, что, как я полагаю, будет в WebKit & V8. Разве синтаксис регулярных выражений JavaScript не поддерживает синтаксис группировки (?: (черт возьми, Google не индексирует знаки препинания!)? Я просто что-то пропустил?

1 Ответ

15 голосов
/ 25 августа 2010

Гах, это был модификатор режима (то есть (?i)) в начале регулярного выражения!

Я прошел через данные Regular-Expressions.info "JavaScript Regular Expression Flavor ", в частности список того, что не поддерживается, и был 'модификатор режима', который я уже указал после закрывающей косой черты регулярного выражения.Разорвал его, все выглядит хорошо.

Итак, мое регулярное выражение JavaScript теперь выглядит следующим образом:

/\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`!()\[\]{};:'".,<>?«»“”‘’]))/gi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...