2
<cffunction name="foo">
     <cfargument name="default">
     <cfoutput>#ARGUMENTS.default#</cfoutput>
     <cfreturn ARGUMENTS.default />
</cffunction>

<cfset LOCAL.derp = "((bar))" />
<cfset LOCAL.derp = LOCAL.derp.replaceAll("\(\((.*)\)\)", foo('$1')) />
<cfoutput>#LOCAL.derp#</cfoutput>

我期待的输出是bar bar我得到的$1 bar。如何在 ColdFusion9 中做到这一点?

4

1 回答 1

5

首先评估 foo 函数,该函数的字符串结果是随后传递给 replaceAll 的结果,replaceAll 不知道它的输入是通过函数提供的。

String.replaceAll是一种接受正则表达式模式字符串和替换字符串的 Java 方法 - 您不能直接传入回调函数。


一个解决方案是使用我创建的cfRegex 库——它有一个 Replace 函数,可以让你传入一个函数来针对每个匹配项执行。

这可以像这样使用:

<cfset Local.Derp = RegexReplace
    ( Pattern     = '\(\((.*)\)\)'
    , Text        = Local.Derp
    , Replacement = replaceWithG1AndOutput
    ) />

<cffunction name="replaceWithG1AndOutput" returntype="String" output=true>
    <!---
        Use Arguments.Match for "((bar))"
        or Arguments.Groups[1].Match for "bar"
    --->
    <cfoutput>#Arguments.Groups[1].Match#</cfoutput>
    <cfreturn Arguments.Groups[1].Match />
</cffunction>
于 2012-09-21T14:19:32.310 回答