2010-05-31 5 views
10

j'ai un regex défini en Python/Ruby/PHP qui est comme çaUn moyen facile de convertir regex à une regex compatible java?

"(forumdisplay.php\?.*page=%CURRENTPAGE%)" 

Quand je le fais pour Java, je dois doubler échapper à cette marque question \\?

comme ceci:

"(forumdisplay.php\\?.*page=%CURRENTPAGE%)"; 

Y at-il une fonction que je peux utiliser pour le faire automatiquement? Ou aurais-je besoin de changer tous mes regex pour travailler avec le moteur de regex Java?

+2

Vous devriez également échapper un point ('.') qui a une signification spéciale (tous les caractères). – Crozin

Répondre

0

Un bon début est généralement de faire un "trouver remplacer tout" de "\" avec "\\".

Vous ne faites pas vraiment de changement pour que cela fonctionne avec le moteur java regex. Vous avez juste à faire face à la peine de stocker une regex dans une chaîne Java ... Vous pourriez le faire dans une fonction, mais cela ferait plus de code à maintenir. Je vous conseille de faire une trouvaille remplacer comme décrit plus haut ...

1

Personnellement, j'utiliser au sein d'Eclipse les plugins EXCELLENTE du site http://www.bastian-bergerhoff.com/eclipse/features/
Vous y trouverez QuickREx pour l'expression régulière et aussi XPath plugin developpeur que j'utilise beaucoup.
Pour QuickREx, il vous suffit de tester votre expression régulière et appuyez sur le bouton pour le copier dans votre éditeur actif avec les bons caractères d'échappement.
C'est un must, il suffit de l'essayer.

+0

Bonjour, votre lien n'est plus valide. Erreur 404 –

3

Notez que c'est pas le moteur d'expression régulière Java qui nécessite la double barre oblique inverse, mais le compilateur Java . Lorsque vous écrivez ce qui suit dans le code source Java:

"(forumdisplay.php\\?.*page=%CURRENTPAGE%)" 

le compilateur Java interprète cela comme la chaîne:

(forumdisplay.php\?.*page=%CURRENTPAGE%) 

Le moteur d'expression régulière Java fait alors exactement la même chose que les autres moteurs d'expression régulière - le point d'interrogation (parce qu'il est échappé) est traité littéralement.

Une chose semblable se produit en Python - les deux chaînes ci-dessous sont identiques:

r"(forumdisplay.php\?.*page=%CURRENTPAGE%)" 
"(forumdisplay.php\\?.*page=%CURRENTPAGE%)" 

Cette utilise la notation Python r pour une chaîne « brute » où antislashs ne sont pas interprétés par le compilateur.

+1

et il n'y a pas d'équivalent à la chaîne brute dans Java? – James

+0

Non, vous devez faire la double évasion en Java – bwawok

10

Essayez cet outil en ligne sur: http://www.regexplanet.com/advanced/java/index.html

Il prend l'expression régulière normale et fournit l'expression de chaîne compatible java. J'ai gagné des tonnes de temps en convertissant d'énormes chaînes de regex moi-même.

Notez que toutes les expressions regex ne fonctionnent pas dans java. J'ai vu une regex de validation php bizarre qui se comporte simplement différemment dans la correspondance de pattern java.

+0

Ce gars a la réponse –