2010-11-22 7 views
0

J'ai une regex complexe que je veux appliquer. Voici mon modèle:Comment puis-je échapper correctement cette corde?

/(?:^|\s|[\.(\+\-\,])(?:\$?)\$((?:[0-9]+(?=[a-z])|(?![0-9\.\:\_\-]))(?:[a-z0-9]|[\_\.\-\:](?![\.\_\.\-\:]))*[a-z0-9]+)/i 

Comment puis-je déclarer ceci comme une chaîne et m'assurer que tout est échappé?

+1

Première étape: simplifiez votre modèle en vous débarrassant des barres obliques inverses et des groupes inutiles: '/(?:\|[\s(+,-])\$?\$((?([0-9]+ (? = [az]) | (?! [0-9.:_-]))(?:[a-z0-9]|[.:_-](?![.:_-])) * [a-z0-9] +)/i' – Gumbo

+0

Avez-vous des problèmes avec 'Pattern.quote()'? – stillstanding

+0

@Gumbo: Qui dit que c'est inutile? S'il doit remplacer l'un des groupes, il a vraiment –

Répondre

2

Il me semble que s'il y a beaucoup de choses inutiles dans ce regex

  1. Quelque chose comme (?:\$?) est le même que celui que \$?
  2. Il n'y a pas besoin de « protéger » les « « « _ », », » ou caractères « + » dans un groupe support carré

Donc ce que vous pourriez vraiment avoir est:

/(?:^|\s|[.(+\-,])\$?\$((?:[0-9]+(?=[a-z])|(?![0-9.:_\-]))(?:[a-z0-9]|[_.\-:](?![._\-:]))*[a-z0-9]+)/i 

Quant à la mettre dans une chaîne, tout ce que vous avez vraiment à vous soucier ici sont les antislashs. Ceux-ci doivent être doublés ("\"). Les caractères externes "/" seraient supprimés et le modificateur "i" final serait transmis à la méthode Pattern.compile().

0

Si vous essayez de tester ce modèle, je vous suggère d'utiliser un outil regex tel que gskinner. Il vous permet de mettre un motif, une chaîne et met en évidence les correspondances.

2

Tant qu'une solution quelque peu statique suffira, et si vous utilisez Eclipse IDE, vous pouvez choisir d'avoir String correctement échappé lors du collage à partir du presse-papier.

Préférences -> Java -> Editeur -> Saisie -> [x] Évadez texte lors du collage ...

Questions connexes