ColdFusion - передать ссылку на регулярное выражение для вызова функции - PullRequest
3 голосов
/ 06 мая 2010

Я использую функцию reFeplace () ColdFusion для замены шаблона регулярного выражения.

Я хотел бы использовать вызов функции для строки замены и передать ей соответствующую обратную ссылку.

Примерно так:

<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.»

Есть ли другой способ добиться этого?

Спасибо, Stu

Ответы [ 3 ]

2 голосов
/ 06 мая 2010

Я не слишком уверен, что то, что вы хотите сделать, возможно с помощью подхода, описанного в вашем примере, но вот схема другого подхода, который должен работать.

  1. Вычеркнуть строку даты
  2. Преобразовать это жало в объект времени, используя CreateDateTime
  3. Выполнять любые операции с датами над этим объектом, например DateAdd
  4. Преобразование обратно в строку с использованием DateFormat
  5. сделать замену

При использовании встроенных функций даты и времени ColdFusion я всегда хочу убедиться, что я передаю объект даты / времени, а не строку даты / времени для параметров, для которых требуется объект даты / времени. Это связано с тем, что ColdFusion может интерпретировать дни строк как месяцы или наоборот.

1 голос
/ 10 мая 2010

У меня есть утилита, которая позволяет вам достичь того, что вы хотите.

Синтаксис не совсем то же самое, и немного раздражает «простые» вещи, но в конечном итоге он более гибок.

По сути, вы пишете функцию, которая принимает строку 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>

1012 *
*

Подробности и скачать здесь: http://www.hybridchill.com/projects/jre-utils.html

Следует иметь в виду, что здесь используется механизм java.util.regex , который отличается от org.apache.oro.text.regex механизма CF и хотя это обеспечивает больше функций, некоторые вещи не работают (пока).

Следующая версия будет довольно серьезной, поэтому любые отзывы, которые вы можете получить, очень приветствуются.

В частности, я размышлял над одной функциональностью - как избежать длинного скучного ручного метода обратного вызова функций, как описано выше - возможно, включить что-то вроде этого:

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

Было бы приятно услышать, если у кого-то есть мысли по этому поводу.

0 голосов
/ 06 мая 2010

Насколько я вижу из вашего примера кода, вы хотите заменить всю строку на дату на час позже, чем показано в вашей строке. Так как есть проблемы с reReplace, я бы попытался удалить часть строки без даты, используя функции replace() или replaceNoCase().

<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 () требует допустимую дату в качестве параметра, я не думаю, что вы можете сделать это с помощью обратной ссылки на регулярное выражение, которая всегда будет строкой.

...