2010-06-15 6 views
6

Tratar de utilizar la etiqueta refind expresión regular para encontrar el contenido dentro de los corchetes en este ejemplo usando ColdFusionexpresión regular encuentra la pregunta de contenido

joe smith <[email protected]> 

El texto resultante debe ser

[email protected] 

El uso de este

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

No tuve suerte. ¿Alguna sugerencia?

Tal vez un problema de sintaxis, funciona en un probador de expresiones regulares en línea que uso.

+0

¿Qué tal si nos dices lo que probaste y no funcionó? Es más fácil ir desde allí ... – jhwist

Respuesta

9

No se puede usar lookbehind con el motor de expresiones regulares de CF (usa Apache Jakarta ORO).

Sin embargo, puede usar Java's regex, que sí los admite, y he creado un envoltorio CFC que lo hace aún más fácil. Disponible a partir de: http://www.hybridchill.com/projects/jre-utils.html

(Actualización:.. La CFC envoltorio antes mencionado ha evolucionado hasta convertirse en un proyecto completo Ver cfregex.net para más detalles)

Además, el ISN cosas /.../s' t requerido/relevante aquí.

Por lo tanto, de su ejemplo, pero con una mejor expresión regular:

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

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


Una nota rápida, ya he actualizado que regex un par de veces; con suerte está en su mejor momento ...

(?<=<) # 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

Eres un genio Peter. Esto funciona bien ... Gracias por la ayuda – jeff

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

algo por el estilo, no prueba que, sin embargo, la suya de que uno;)

0

nunca he sido feliz con la expresión regular que coincida con funciones en la FQ Por lo tanto, escribí mi propia:

<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> 

Aplicado a su problema, aquí está mi ejemplo:

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

Dumping los "partidos" variable muestra que se trata de una matriz con 2 artículos. El primero será <[email protected]> (porque coincide con la expresión regular completa) y el segundo será [email protected] (porque coincide con el primer grupo definido en la expresión regular; todos los grupos subsiguientes también se capturarán e incluirán en la matriz).

+1

Gracias Adam, pude usar el envoltorio que desarrolló Peter, pero gracias por tus dos centavos también. – jeff

Cuestiones relacionadas