2010-03-25 11 views
3

Je suis un novice relatif aux expressions régulières (bien que je les ai utilisé plusieurs fois avec succès). Je veux trouver tous les liens dans un document qui ne se termine pas par « .html » L'expression régulière, je suis venu avec est:RegExp: vous voulez trouver tous les liens qui ne se terminent pas dans ".html"

href=\"([^"]*)(?<!html)\" 

Dans Notepad ++, mon éditeur, href=\"([^"]*)\" trouve tous les liens (ceux cette fin en "html" et ceux qui ne le font pas). Pourquoi le lookbehind négatif ne fonctionne-t-il pas?

J'ai aussi essayé préanalyse:

href=\"[^"]*(?!html\") 

mais cela ne fonctionne pas non plus.

Quelqu'un peut-il aider?

Cheers, rampent

+9

Je pense que Notepad ++ ne prend pas en charge les assertions look-behind. – Gumbo

+1

Il est si moche d'essayer de faire fonctionner regex avec Notepad ++. J'abandonne, il y a tellement de restrictions gênantes. – pars

Répondre

8

Cette expression régulière fonctionnerait très bien, si vous utilisiez PERL ou PCRE (par exemple preg_match en PHP). Cependant, les assertions lookahead et lookbehind ne sont pas supportées par la plupart des moteurs d'expressions, en particulier les plus simples et les plus réguliers, comme celui utilisé par le Notepad ++. Seules les syntaxes les plus élémentaires telles que les quantificateurs, les sous-modèles et les classes de caractères sont supportées par presque tous les moteurs d'expressions régulières.

Vous trouverez la documentation pour le notepad ++ moteur d'expression régulière à: http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Regular_Expressions

+0

La documentation prête à confusion, car elle comporte une section sur les solutions de recherche, ce qui semble indiquer qu'elles sont prises en charge. – mellamokb

1

Edit: Notepad ++ en utilisant le moteur d'expression régulière SciTE et il ne supporte pas regarder autour des expressions.

Pour plus d'informations jeter un coup d'oeil ici http://www.scintilla.org/SciTERegEx.html


originale Réponse

^.*(?<!\.html)$

1

Vous pouvez faire une expression rationnelle qui le fait, mais il serait probablement trop complexe:

href=\"((([^"]*)([^h"][^"][^"][^"]|[^t"][^"][^"]|[^m"][^"]|[^l]))|([^"]|)([^"]|)([^"]|))\" 
0

Je vous remercie tous beaucoup. En fin de compte, l'expression régulière ne fonctionnait vraiment pas. J'ai simplement utilisé une solution de contournement et remplacé tous les liens par eux-mêmes + ". Html", puis remplacé toutes les occurrences de ".html.html" par ".html".

Je remplacé href=\"([^"]*)\" avec href="\1.html" puis .html.html avec .html

Merci quand même, rampent

0

Notez que Notepad ++ (maintenant?) Prend en charge assertions comme ça. (J'ai Notepad ++ 6.3, en date du 3 février 2012.)

Je crois que le Regular Expressions documentation implique que les deux REPLACE variantes utilisent le même PCRE dialecte:

  • standard: Search | Replace (raccourci par défaut Ctrl H)
  • plug-in
  • : TextFX | TextFX Quick | Find/Replace (raccourci par défaut Ctrl R)