ColdFusion - Pass Regex Backreference для функционирования звонка

StackOverflow https://stackoverflow.com/questions/2780436

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

Это было полезно?

Решение

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

  1. Разделить строку даты
  2. Преобразовать это тингом до объекта времени с использованием создания
  3. Выполнять любые операции даты на этом объекте IE DateAndd
  4. Конвертировать обратно в строку с использованием DateFormat
  5. Сделать замену

При использовании встроенных функций даты 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, который всегда будет строкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top