помочь сделать "универсальный" регулярное выражение совместимым с JavaScript - PullRequest
1 голос
/ 08 февраля 2011

На этом сайте я нашел очень хорошее средство сопоставления регулярных выражений URL: http://daringfireball.net/2010/07/improved_regex_for_matching_urls. В нем говорится, что он бесплатный и совместим с разными языками (включая Javascript). Прежде всего, мне нужно избежать некоторых косых черт, чтобы компилировать их вообще. Когда я делаю это, он прекрасно работает на Rubular.com (где я обычно тестирую регулярные выражения), со странным побочным эффектом, когда каждое совпадение имеет 5 полей: 1 - это URL, а дополнительные 4 - пустые. Когда я помещаю это в JS, я получаю ошибку «Invalid Group». Я использую Node.js, если это что-то меняет, но я бы хотел понять эту ошибку. Я хотел бы сократить ненужные пустые поля соответствия, но я даже не знаю, с чего начать диагностику этого зверя. Вот что я получил после побега:

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

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

На самом деле, вам также не нужна первая группа захвата ; в этом случае оно совпадает со всем совпадением, и к нему всегда можно получить доступ через $&. Вы можете изменить все группы захвата на без захвата, добавив ?: после вступительного слова:

/\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), который требует, чтобы вы экранировали этот конкретный символ, а не регулярное выражение. Некоторые языки позволяют выбирать разные разделители регулярных выражений, в то время как другие не поддерживают литералы регулярных выражений вообще.

Но это все языковые проблемы, а не проблемы регулярных выражений; само регулярное выражение работает так, как рекламируется.

2 голосов
/ 08 февраля 2011

Кажется, вы неправильно его скопировали.

http://www.regular -expressions.info / javascript.html

  • Нет модификаторов режима для установки параметров соответствия в регулярном выражении.
  • Нет комментариев регулярных выражений

т.е. (? xi) в начале бесполезно.
x вообще бесполезен для сжатого RegExp
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`!()\[\]{};:'".,<>?«»“”‘’]))/i

Протестировано и работает в Google Chrome => должно работать в Node.js

...