2010-06-15 14 views
6

Cercando di utilizzare tag refind regex per trovare il contenuto all'interno delle parentesi in questo esempio Uso di ColdFusionregex trovare domande contenuti

joe smith <[email protected]> 

Il testo risultante dovrebbe essere

[email protected] 

Usando questo

<cfset reg = refind(
"/(?<=\<).*?(?=\>)/s","Joe <[email protected]>") /> 

Non avere fortuna. Eventuali suggerimenti?

Forse un problema di sintassi, funziona in un tester regex on-line che uso.

+0

Che ne dici di dirci cosa hai provato e non ha funzionato? È più facile andare da lì ... – jhwist

risposta

9

Non è possibile utilizzare la ricerca con il motore regex di CF (utilizza Apache Jakarta ORO).

Tuttavia, è possibile utilizzare Java's regex, che li supporta e ho creato un wrapper CFC che semplifica ulteriormente la procedura. Disponibile da: http://www.hybridchill.com/projects/jre-utils.html

(Aggiornamento:.. Il CFC involucro di cui sopra si è evoluto in un progetto completo Vedi cfregex.net per i dettagli)

Inoltre, il /.../s roba isn' t obbligatorio/pertinente qui.

Quindi, dal vostro esempio, ma con una migliore espressione regolare:

<cfset jrex = createObject('component','jre-utils').init()/> 

<cfset reg = jrex.match("(?<=<)[^<>]+(?=>)" , "Joe <[email protected]>") /> 


Una breve nota, dal momento che ho aggiornato che regex un paio di volte; speriamo che sia al meglio ora ...

(?<=<) # positive lookbehind - start matching at `<` but don't capture it. 
[^<>]+ # any char except `<` or `>`, the `+` meaning one-or-more greedy. 
(?=>) # positive lookahead - only succeed if there's a `>` but don't capture it. 
+0

Sei un genio Peter. Funziona bene .. Grazie per l'aiuto – jeff

-1
/\<([^>]+)\>$/ 

qualcosa di simile, non prova, però, questo è uno tuo;)

0

Non sono mai stato felice con l'espressione regolare funzioni corrispondenti in CF. Quindi, ho scritto il mio:

<cfscript> 
    function reFindNoSuck(string pattern, string data, numeric startPos = 1){ 
     var sucky = refindNoCase(pattern, data, startPos, true); 
     var i = 0; 
     var awesome = []; 

     if (not isArray(sucky.len) or arrayLen(sucky.len) eq 0){return [];} //handle no match at all 
     for(i=1; i<= arrayLen(sucky.len); i++){ 
      //if there's a match with pos 0 & length 0, that means the mime type was not specified 
      if (sucky.len[i] gt 0 && sucky.pos[i] gt 0){ 
       //don't include the group that matches the entire pattern 
       var matchBody = mid(data, sucky.pos[i], sucky.len[i]); 
       if (matchBody neq arguments.data){ 
        arrayAppend(awesome, matchBody); 
       } 
      } 
     } 
     return awesome; 
    } 
</cfscript> 

Applicato al tuo problema, qui è il mio esempio:

<cfset origString = "joe smith <[email protected]>" /> 
<cfset regex = "<([^>]+)>" /> 
<cfset matches = reFindNoSuck(regex, origString) /> 

Dumping la "corrisponde" variabile dimostra che si tratta di un array con 2 elementi. Il primo sarà <[email protected]> (perché corrisponde all'intera espressione regolare) e il secondo sarà [email protected] (poiché corrisponde al primo gruppo definito nell'espressione regolare - tutti i gruppi successivi verranno acquisiti e inclusi nell'array).

+1

Grazie Adam, sono stato in grado di usare il wrapper sviluppato da Peter, ma grazie anche per i tuoi due centesimi. – jeff

Problemi correlati