正则表达式找到内容问题

时间:2010-06-15 15:06:45

标签: regex coldfusion

尝试使用正则表达式refind标记在此示例中使用coldfusion查找括号内的内容

 joe smith <joesmith@domain.com>

结果文本应为

 joesmith@domain.com

使用此

<cfset reg = refind(
 "/(?<=\<).*?(?=\>)/s","Joe <joe@domain.com>") />

没有运气。有什么建议吗?

可能是语法问题,它适用于我使用的在线正则表达式测试程序。

3 个答案:

答案 0 :(得分:9)

你不能在CF的正则表达式引擎中使用lookbehind(使用Apache Jakarta ORO)。

但是,您可以使用Java's regex,它确实支持它们,并且我创建了一个包装器CFC,使这更容易。可从: http://www.hybridchill.com/projects/jre-utils.html

(更新:上面提到的包装器CFC已演变为完整项目。有关详细信息,请参阅 cfregex.net 。)

此外,/.../s内容不需要/相关。

所以,从你的例子来看,但改进了正则表达式:

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

<cfset reg = jrex.match( "(?<=<)[^<>]+(?=>)" , "Joe <joe@domain.com>" ) />


快速说明,因为我已经更新了几次正则表达式;希望它现在处于最佳状态......

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

答案 1 :(得分:0)

我从未对CF中的正则表达式匹配函数感到满意。因此,我写了自己的:

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

应用于您的问题,这是我的例子:

<cfset origString = "joe smith <joesmith@domain.com>" />
<cfset regex = "<([^>]+)>" />
<cfset matches = reFindNoSuck(regex, origString) />

转储“matches”变量表明它是一个包含2个项目的数组。第一个将是<joesmith@domain.com>(因为它匹配整个正则表达式),第二个将是joesmith@domain.com(因为它匹配正则表达式中定义的第一个组 - 所有后续组也将被捕获并包含在内在数组中)。

答案 2 :(得分:-1)

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

类似的东西,但没有测试它,那是你的;)