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")) />

しかし、「現在\ 1であるパラメータ3の値は、クラスjava.util.Date値でなければならない」ため、これは失敗します。

これを達成する他の方法はありますか?

ありがとう、Stu

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

覚えておくべきことの1つは、これはCFのorg.apache.oro.text.regexエンジンとは異なるjava.util.regexエンジンを使用することです。これはより多くの機能を提供しますが、いくつかの機能は動作しません(まだ)。

次のバージョンはかなりメジャーなリリースになる予定なので、フィードバックをお待ちしております。

具体的には、私が熟考してきた機能の1つは、上記のような長時間の手動関数コールバックメソッドを回避する方法です。おそらく次のようなものを有効にします。

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

誰かがそれについて考えているかどうか聞いてみるといいでしょう。

于 2010-05-10T13:11:49.260 に答える
0

コード例からわかる限り、文字列全体を、文字列に表示されているよりも1時間後の日付に置き換えたいと考えています。reReplaceに問題があるので、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 に答える