4

我正在使用 ColdFusion 的 reReplace() 函数进行正则表达式模式替换。

我想对替换字符串使用函数调用,并将匹配的反向引用传递给它。

像这样的东西:

<cfset s = "STARTDATE_2010-05-07 00:05:00.0_ENDDATE" />
<cfset s = reReplace(s, "STARTDATE_([\s-.:0-9]*)_ENDDATE", dateAdd("h", 1, "\1")) />

但这失败了,因为“参数 3 的值,当前为 \1,必须是类 java.util.Date 值。”

有没有其他方法可以实现这一目标?

谢谢,斯图

4

3 回答 3

2

我不太确定您想要做的事情是否可以通过您的示例中描述的方法来实现,但这里是另一种应该可行的方法的概要。

  1. 去掉日期字符串
  2. 使用 CreateDateTime 将此字符串转换为时间对象
  3. 对此对象执行任何日期操作,即 DateAdd
  4. 使用 DateFormat 转换回字符串
  5. 进行更换

在使用内置的 ColdFusion 日期和时间函数时,我喜欢始终确保传入的是日期/时间对象,而不是需要日期/时间对象的参数的日期/时间字符串。这是因为 ColdFusion 可能会将字符串天解释为月,反之亦然。

于 2010-05-06T12:21:12.217 回答
1

我有一个实用程序,可以让你实现你想要的。

语法不太一样,对“简单”的东西有点刺激,但最终它更灵活。

基本上你写一个函数,它接受一个Match字符串和Groups数组并返回一个字符串 - 在函数内部你可以做你喜欢的事情,它会被应用到每个匹配。

像这样:

<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引擎不同,虽然它提供了更多功能,但有些东西不起作用(还)。

下一个版本将是一个相当重要的版本,因此非常欢迎您提供任何反馈。

具体来说,我一直在思考的一个功能是如何避免上面冗长的手动函数回调方法——也许可以启用这样的功能:

Jrex.replace( MyString , MyRegex , "\F:DateAdd('h',1,\1)" , 'all' )

很高兴听到有人对此有想法。

于 2010-05-10T13:11:49.260 回答
0

据我从您的代码示例中可以看出,您希望将整个字符串替换为比字符串中显示的日期晚一小时的日期。replace()由于替换存在问题,我会尝试使用orreplaceNoCase()函数去除字符串的非日期部分。

<cfset s = "STARTDATE_2010-05-07 00:05:00.0_ENDDATE" />
<cfset s = replaceNoCase(replaceNoCase(s, "STARTDATE_", ""),"_ENDDATE","")>
<cfoutput>
    <cfif isDate(s)>
        before: #s# after: #dateAdd("h", 1, s)#
    </cfif> 
</cfoutput>

dateAdd() 需要一个有效的日期作为参数,我认为你不能用一个总是字符串的正则表达式反向引用来做到这一点。

于 2010-05-06T12:14:44.457 回答