2012-04-22 4 views
1

Nouveau à coldfusion, nouveau pour ... regexcomment utiliser un filtre utilisant l'expression rationnelle dans Coldfusion

J'ai un répertoire de fichiers, nommé avec « certains » suivi d'un numéro de 13digit, suivi par underscore, ID et le fichier se termine comme suit:

some0000000000000_ID.jpg 

L'ID peut être une chaîne quelconque.

Comment obtenir l'ID à l'aide de regex? Je suppose que je serais à la recherche de quelque chose comme ça, qui capte tout entre le trait de soulignement et le fichier se termine point:

_\A[A-Z]*[a-z]*[0-9]*$ 

mais je ne suis vraiment pas aller nulle part. Quelqu'un peut me diriger dans la bonne direction?

Merci!

EDIT:
J'ai fini par le faire comme ça, qui est hack ish mais fonctionne bien:

<cfset cropFront = #ListRest(ReReplaceNoCase(name, ".png|.jpg", ""), "_")#> 
<cfset cropFull = #ListFirst(ReReplaceNoCase(cropFront, "xxxxx", ""), ".")#> 

Peut-être utile pour quelqu'un d'autre, aussi!

+0

+1 pour partager votre solution. La partie d'analyse de chaîne n'est pas vraiment hackish. Notez que l'inclusion de l'expression dans '##' n'est pas nécessaire. Vous en avez besoin seulement quand vous produisez des résultats d'expression sur la page et dans certaines balises CF comme '' ou ''. – Tomalak

Répondre

5
<cfdirectory name="images" directory="#path#" filter="some?????????????_ID.jpg"> 

Le filtre n'est pas un motif regex. Il ne connaît que les caractères génériques ? et *.

+0

mais ID peut être "maison" ou "a_very_long_word", vais-je toujours obtenir cela en utilisant seulement le filtre? – frequent

+0

Bien sûr. 'filter =" certains ????????????? _ *. jpg "' - Vous pourriez utiliser 'ListFirst (name," _ ")' pour obtenir le 'un ??????? ?????? 'part, et' ListRest (ReplaceNoCase (name, ".jpg", ""), "_") 'pour disséquer le nom du fichier sans regex. – Tomalak

+0

Cool. Cela ressemble à quelque chose que je peux travailler avec! Merci beaucoup ... il faudra du temps avant que je ne parle regex difficile ... ;-) – frequent

2

ne peut pas tester au moment, mais cela est l'idée ...

<cfdirectory name="files" directory="path" action="list" /> 

<cfloop query="files"> 
    <cfset findinfo = refind("^some(\d{13})_", files.name, 0, true) /> 
    <cfif arraylen(findinfo.pos) eq 2> 
     <cfset fileid = mid(files.name, findinfo.pos[2], findinfo.len[2]) /> 
     <!--- do something ---> 
    </cfif> 
</cfloop> 
+0

Ceci est très fragile. Vous devriez faire une vérification de portée sur le tableau 'findinfo'. – Tomalak

+1

absolument, va éditer –

Questions connexes