2010-03-31 10 views
3

Ceci est une regex JavaScript.regex: comment éliminer les URLs se terminant par .dtd

regex = /(http:\/\/[^\s]*)/g; 

text = "I have http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd and I like http://google.com a lot"; 

matches = text.match(regex); 

console.log(matches); 

Je reçois les deux urls dans le résultat. Cependant, je veux éliminer toutes les URLs se terminant par .dtd. Comment je fais ça?

Notez que je dis finissant par .dtd devrait être enlevé. Cela signifie qu'une url comme http://a.dtd.google.com devrait passer.

Répondre

3

La plus belle façon de le faire est d'utiliser un lookbehind négatif (dans les langues qui les soutiennent):

/(?>http:\/\/[^\s]*)(?<!\.dtd)/g 

Le ?> dans la première tranche en fait un groupement atomique qui arrête le moteur regex retours en arrière - si il va correspondre à l'URL complète comme il le fait maintenant, et si/quand la prochaine partie échoue, il n'essaiera pas de revenir en arrière et de faire moins de correspondance.

Le (<!\.dtd) est un test arrière négatif, ce qui correspond seulement si \.dtdne fait pas partie se terminant à cette position (à savoir, l'URL ne se termine pas dans .dtd).

Pour les langues qui ne sont pas (comme JavaScript), vous pouvez faire une place négative préanalyse, ce qui est un peu plus laid et est généralement moins efficace:

/(http:\/\/(?![^\s]*\.dtd\b)[^\s]*)/g 

correspondra à http://, puis balayez l'avant pour vous assurer qu'il ne se termine pas en .dtd, puis revenez en arrière et scannez à nouveau pour obtenir la correspondance réelle.

Comme toujours, http://www.regular-expressions.info/ est une bonne référence pour plus d'informations

+0

obtenir erreur de syntaxe en raison de

<
dans (?

+0

Hmm. Il est possible que JavaScript ne supporte pas lookbehinds alors. Dans ce cas, je ne peux pas penser à une façon sympa de le faire avec une seule expression rationnelle - votre meilleur pari est simplement d'utiliser ce que vous avez maintenant, faites une boucle sur les résultats et supprimez manuellement toute fin dans ".dtd". – Chris

+0

Je sais que JavaScript ne supporte pas regarder derrière. Cependant, il supporte l'anticipation positive et négative. –

Questions connexes