ColdFusion - Pass Regex Backreference для функционирования звонка
-
03-10-2019 - |
Вопрос
Я использую функцию Rerepuse () 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.
Решение
Я не слишком уверен, что то, что вы хотите сделать, это возможно по подходу, описанному в вашем примере, но вот очертаний другого подхода, который должен работать.
- Разделить строку даты
- Преобразовать это тингом до объекта времени с использованием создания
- Выполнять любые операции даты на этом объекте IE DateAndd
- Конвертировать обратно в строку с использованием DateFormat
- Сделать замену
При использовании встроенных функций даты HoldFusion я люблю всегда убедиться, что я прохожу в объекте даты / времени, а строка даты / времени для параметров, которые требуют объекта даты / времени. Это потому, что ColdFusion может интерпретировать строки дня в качестве месяцев или наоборот.
Другие советы
У меня есть утилита, которая позволяет вам достичь того, что вы хотите.
Синтаксис не совсем не такой, и таб, раздражающий для «простых» вещей, но в конечном итоге он более гибкий.
В основном вы пишете функцию, которая принимает 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' )
Было бы приятно слышать, если у кого-то есть мысли на этом.
Насколько я могу видеть из вашего примера кода, вы хотите заменить всю строку с датой на один час позже, чем отображается в вашей строке. Поскольку есть проблемы с реемом, я бы попытался отложить нетатущую часть строки, используя 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>
dateAddd () требует действительной даты, в качестве параметра, я не думаю, что вы можете сделать это с Regex Backreference, который всегда будет строкой.