2010-09-09 4 views
4

J'ai trouvé this very handy regular expression sur regexlib.com, mais je ne sais pas comment l'implémenter dans mon application. Je l'ai testé en utilisant leur outil de test en ligne, et il fait en effet tout ce dont j'ai besoin. Le coller en tant que paramètre à REFind() de ColdFusion ne fonctionnait pas et renvoyait un message d'erreur inutile.Comment implémenterais-je cette regex dans ColdFusion (ou Java)?

Je travaille dans ColdFusion, j'ai donc accès à des classes Java si nécessaire. Des réponses en Java ou ColdFusion seraient utiles.

Une chaîne bonne exemple serait quelque chose comme: 5' 1/2"

EDIT

Je dois utiliser des groupes dans le regex afin d'en extraire les données par opposition à simplement l'utiliser pour valider une chaîne. Je suppose que cela signifie que je devrais en utilisant rEVANCHE()? S'il vous plaît excuser mon manque d'expérience avec regex!

EDIT 2

Il semble que l'utilisation refind() avec cette expression:

(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1} 

ne trouve pas les résultats obtenus pour la plupart des données de test je donne, y compris ceux qui retournent les matches en utilisant le testeur de regexlib.com: 1ft 2-3/4 in, 2' 3 4/5", 3ft, 4', 5 in, 6", 7.125 in, 3ft 4.5 in

+0

En ce qui concerne modifier 2, est-elle transmis comme une chaîne exacte plutôt que comme code Java? Si c'est le cas, essayez de changer les doubles barres obliques en barres obliques simples. – lins314159

+0

Il est passé en tant que chaîne, singulariser les barres obliques ressemble à l'astuce, avec quelques vérifications à chaque résultat du tableau subs.pos pour s'assurer qu'ils ne contiennent pas 0 (ce qui était des erreurs de lancer). Merci! –

Répondre

4

Le? <foo> La syntaxe n'est pas prise en charge dans ColdFusion. Je ne connais pas cette syntaxe, mais il semble qu'elle soit utilisée pour attribuer des noms aux sous-expressions capturées. Par exemple, la première sous-expression est le nombre représentant les pieds, donc il a le? <Pieds> étiquette. Vous pouvez supprimer ces balises sans affecter ce que l'expression régulière correspond.

Je ne l'ai pas testé, mais tous les autres éléments que je vois dans ce regex sont pris en charge dans ColdFusion, donc refind() devrait fonctionner après avoir enlevé tous les? <foo> étiquettes. L'accès aux sous-expressions est bien sûr supporté en utilisant l'argument "returnsubexpressions". Voir les documents CF standard sur REFind().

En aparté, le regex semble un peu bavard. {0,1} est rare, comme? signifie la même chose. {1} est encore plus rare, car il s'agit de la valeur par défaut pour les regroupements et peut donc être complètement omis.

ADDENDA

regex = "(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}"; 
subs = REFind(regex,input,1,"True"); 
if (subs.pos[1] eq 0) { 
    found = "False"; 
} else { 
    found = "True"; 
    feet = Mid(input,subs.pos[2],subs.len[2]); 
    inches = Mid(input,subs.pos[3],subs.len[3]); 
    fraction = Mid(input,subs.pos[4],subs.len[4]); 
    fracNum = Mid(input,subs.pos[5],subs.len[5]); 
    fracDem = Mid(input,subs.pos[6],subs.len[6]); 
    decimal = Mid(input,subs.pos[7],subs.len[7]); 
    if (feet is "") { 
    // Use the _other_ feet 
    feet = Mid(input,subs.pos[8],subs.len[8]); 
    } 
} 
+0

merci, il fonctionne en effet sans ces balises, comme l'a souligné @ lins314159. Savez-vous comment je pourrais être en mesure d'accéder à ces groupes en utilisant une syntaxe différente? –

+0

wow merci! trouvé est de retour faux, compte tenu de mon exemple d'entrée ci-dessus: 5 '1/2 "en utilisant le testeur à regexlib.com cela donne un ensemble de correspondances –

+0

IIRC, la structure? est une extension Microsoft, et non pris en charge par quelque chose en dehors de C#/VB/etc .. Je ne suis pas entièrement sûr de savoir comment google? pour vérifier, cependant. :-) –

0

Java String object prend en charge regex. Sting.match(), String.replaceAll() et String.replaceFirst().

1

On dirait que l'expression que vous aviez était en syntaxe C#, qui prend en charge les groupes nommés (par exemple (?<Decimal>\.\d*)). Java ne le fait pas, et les traite comme quelque chose de complètement différent. Puisque les groupes nommés ne sont pas utilisés de toute façon, il suffit de supprimer la partie de nommage (par exemple (?<Decimal>\.\\d*) devient (\.\\d*)).

Pattern.compile("(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}"); 
+0

Je devais être plus clair dans ma question initiale: je DOIS utiliser les groupes pour extraire les valeurs correspondantes. Savez-vous comment je peux le faire dans la syntaxe Java? –

+0

Vous aurez au numéro de groupe (à partir de 1). Pour obtenir le groupe Pouces, vous utiliserez 'matcher.group (2)'. – lins314159