尝试使用正则表达式refind标记在此示例中使用coldfusion查找括号内的内容
joe smith <joesmith@domain.com>
结果文本应为
joesmith@domain.com
使用此
<cfset reg = refind(
"/(?<=\<).*?(?=\>)/s","Joe <joe@domain.com>") />
没有运气。有什么建议吗?
可能是语法问题,它适用于我使用的在线正则表达式测试程序。
答案 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)
/\<([^>]+)\>$/
类似的东西,但没有测试它,那是你的;)