Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

regex find content question

Trying to use regex refind tag to find the content within the brackets in this example using coldfusion

 joe smith <[email protected]>

The resulting text should be

 [email protected]

Using this

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

Not having any luck. Any suggestions?

Maybe a syntax issue, it works in an online regex tester I use.

like image 581
jeff Avatar asked Jun 15 '10 15:06

jeff


1 Answers

You can't use lookbehind with CF's regex engine (uses Apache Jakarta ORO).

However, you can use Java's regex though, which does support them, and I've created a wrapper CFC that makes this even easier. Available from: http://www.hybridchill.com/projects/jre-utils.html

(Update: The wrapper CFC mentioned above has evolved into a full project. See cfregex.net for details.)

Also, the /.../s stuff isn't required/relevant here.

So, from your example, but with improved regex:

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

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


A quick note, since I've updated that regex a few times; hopefully it's at its best now...

(?<=<) # 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.
like image 164
Peter Boughton Avatar answered Oct 08 '22 17:10

Peter Boughton