Comment puis-je corriger l'erreur « de groupe non valide » lors d'une tentative d'utiliser « amélioré » le motif d'exprat correspondant URL Gruber en JavaScript?

StackOverflow https://stackoverflow.com/questions/3559113

  •  01-10-2019
  •  | 
  •  

Question

Je tente d'intégrer de John Gruber Un libéral améliorée, modèle Regex précis pour les URL assortis dans l'un de mes Javascripts, mais l'inspecteur de WebKit (dans Google Chrome 5.0.375.125 pour Mac) donne un « groupe non valide » erreur de syntaxe d'expression régulière.

regexp original de Gruber est suit comme:

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

La ligne de mon JavaScript w / l'expression rationnelle est la suivante (w / barre oblique inverse échappé slashes):

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>');

Et l'erreur Google Chrome (? V8) est comme suit:

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

Et l'erreur Safari se présente comme suit:

SyntaxError: Invalid regular expression: unrecognized character after (?

Il affirme qu'il devrait travailler dans regexp modernes JavaScript interprètes, que je suppose WebKit et V8 serait. La syntaxe regexp de JavaScript Est-ce que ne supporte pas le (?: (damner Google pour ne pas la ponctuation indexation!) syntaxe de regroupement? J'ai manqué juste échapper à quelque chose?

Était-ce utile?

La solution

Gah, il a été le (à savoir le (?i)) mode modificateur au début de la regex!

je suis passé par Regular-Expressions.info de datails sur les "saveur des expressions régulières de JavaScript" , en particulier la liste de ce qui est pas pris en charge, et il y avait le « modificateur de mode », que je l'avais déjà précisé après la clôture barre oblique de la regex. Déchira sur un tout semble bien.

Alors, mon regex JavaScript est suit maintenant:

/\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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top