Créez l'expression régulière la plus courte qui correspondra approximativement à une URL dans le texte lorsqu'elle est exécutée en JavaScript
Exemple:
"some text exampley.com".match(/your regular expression goes here/);
L'expression régulière doit
- capturez toutes les URL valides pour http et https.
- ne vous inquiétez pas de ne pas faire correspondre les chaînes de recherche d'URL qui ne sont pas réellement des URL valides comme
super.awesome/cool
- être valide lorsqu'il est exécuté en tant que regex JavaScript
Critères de test:
Rencontre:
- http://example.com
- http://example.com/
- http://example.com/super
- https://example.com/super
- example.com/super
- exemple.com
- example.com/su-per_duper/?add=yes&subtract=no
- example.com/archive/index.html
- twitter.com/#!/reply
- example.com/234ret2398oent/234nth
- codegolf.stackexchange.com/questions/464
- crazy.wow.really.example.com/?cat=nth%3E
- exemple-exemple.com
- example1.com
Ne pas correspondre:
- exemple
- super cool
- Bonjour
- je peux
- Bonjour.
Voici un test qui pourrait aider à clarifier un peu http://jsfiddle.net/MikeGrace/gsJyr/
Je m'excuse pour le manque de clarté, je n'avais pas réalisé à quel point les URL correspondantes étaient affreuses.
code-golf
javascript
regular-expression
Mike Grace
la source
la source
\w
pour tout. Vous attendez-vous à des références arrières pour différents composants URL?/:/
comme expression régulière et faire correspondre des URI valides et ne pas faire correspondre tous vos exemples sur la liste »Pas de correspondance«. Tant que vous empruntez cette route, la question est simplement la suivante: quelle est l'expression régulière la plus courte qui ne correspondra à aucune des chaînes d'exemple mais qui interceptera toujours tous les URI.Réponses:
ne correspond pas à 3 chaînes qu'il ne devrait pas, correspond à presque tout le reste;)
upd: il ne correspond toujours pas aux 5
la source
Celui-ci fonctionne:
Réussit les tests sur http://jsfiddle.net/9BYdp/1/
Correspond également à:
la source
http://user:[email protected]/path
Cela ne fait évidemment pas ce que vous avez l'intention, mais cela répond à vos critères:
"correspond à toutes les URL valides pour http et https."
oui, correspondra certainement.
"ne vous inquiétez pas de ne pas faire correspondre les chaînes de recherche d'URL qui ne sont pas réellement des URL valides comme 'super.awesome / cool'"
oui, bien sûr, il y aura beaucoup de faux positifs, mais vous avez dit que cela n'avait pas d'importance.
être valide lorsqu'il est exécuté en tant que regex JavaScript
bien sûr que les œufs fonctionnent comme vous le dites.
Si ce résultat n'est PAS une bonne réponse, alors vous devez être plus sélectif avec vos critères.
Pour être une règle qui fonctionne comme vous le souhaitez, vous devez faire besoin de mettre en œuvre un matcher conforme à la RFC complète et un adaptateur compatible RFC complet sera « souci de ne pas correspondre ».
Donc, en termes de "permis ne correspondant pas", vous devez spécifier exactement quels écarts par rapport au RFC sont autorisés.
Tout le reste, et tout cet exercice est une imposture, parce que les gens vont simplement écrire tout ce qui fonctionne pour eux, ou comment ils l'aiment, et sacrifier "avoir un sens" au profit d'être court (comme je l'ai fait).
Sur votre mise à jour
Le regex le plus naïf que je puisse trouver qui correspond (et capture) tous vos exemples collés jusqu'à présent est:
Sa nature est assez simple et suppose que seules 3 formes de base sont possibles.
z
peut être quelque chose et non des espaces.x
peut être autre chose qu'un espace.y
peut être tout ce qui n'est ni un espace ni un caractère '/'.Il y a beaucoup de choses qui seront valables pour cette règle, beaucoup, mais elles ressembleront au moins à un URI valide pour un humain, elles ne seront tout simplement pas compatibles avec les spécifications.
par exemple:
Je pense que l'approche sensée consiste à extraire les éléments susceptibles d'être des URI, puis à les valider avec quelque chose de plus strict, j'essaie de trouver comment utiliser la classe URI des navigateurs pour les valider =).
Mais vous pouvez voir le raisonnement ci-dessus travailler sur cet exemple ici: http://jsfiddle.net/mHbXx/
la source
/:/
même faire mieux avec même après la retouche :-)Essayez ça.
J'inclus les barres obliques de début et de fin qui délimitent l'expression régulière, donc j'espère que cela ne nuit pas au nombre de mes personnages!
Ce modèle limite le protocole à http ou https, autorise un numéro de port facultatif, puis autorise tout caractère à l'exception des espaces.
la source