我有一个实用工具,可以让你实现你想要的。
语法不完全相同,有点刺激'简单'的东西,但最终它更灵活。
基本上你写了一个函数,它接受一个Match
字符串和Groups
数组,并返回一个String - 在函数内部,你可以做你喜欢的事情,并且它会被应用到每个匹配上。
像这样:
<cfset Jrex = createObject('component','jre-utils').init() />
<cfset MyString = "STARTDATE_2010-05-07 00:05:00.0_ENDDATE" />
<cfset MyRegex = "STARTDATE_([\s-.:0-9]*)_ENDDATE" />
<cfset MyString = Jrex.replace(MyString , MyRegex , addHour , 'all')/>
<cffunction name="addHour" returntype="String" output="false">
<cfargument name="Match" type="String"/>
<cfargument name="Groups" type="Array" default="#ArrayNew(1)#"/>
<cfset var Result = DateAdd('h',1,Groups[1]) />
<cfreturn DateFormat(Result , 'yyyy-mm-dd')
& ' ' & TimeFormat(Result , 'HH:mm:ss')
/>
</cffunction>
详情和下载在这里: http://www.hybridchill.com/projects/jre-utils.html
有一点要记住的是,这个使用java.util.regex中引擎,这与CF的org.apache.oro.text.regex引擎不同,并且虽然这提供了更多特征,但fe w事情不起作用(还)。
下一个版本将会是一个相当重要的版本,所以你可能有任何反馈都非常受欢迎。
具体来说,一个功能我一直在琢磨的是如何避免长篇大论的手动功能回调方法如上 - 也许让这样的事情:
Jrex.replace(MyString , MyRegex , "\F:DateAdd('h',1,\1)" , 'all')
将是很好的听到的话,任何人有对此的想法。
关于为什么不起作用的说明:CF将正则表达式评估转交给Java引擎,该引擎需要字符串参数。因此,CF会在尝试将所有内容评估为字符串之前进行评估。我们都希望你能传递函数,但它不起作用。虽然加里有正确的想法。 – 2010-05-06 14:06:21
啊哈 - 有趣的东西。我想这就是我真正想知道的 - 但我不能将评论标记为已接受的答案:-) – stubotnik 2010-05-06 15:14:03