У меня есть утилита, которая позволяет вам достичь того, чего вы хотите.
Синтаксис не совсем такой же, и немного раздражает «простые» вещи, но в конечном итоге он более гибкий.
В основном вы пишете функцию, которая принимает строку 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's org.apache.oro.text.regex, и, хотя это обеспечивает больше возможностей, fe w ничего не работает (пока).
Следующая версия будет довольно крупной версией, поэтому любая обратная связь, которую вы можете получить, очень приветствуется.
В частности, одна функциональность я размышлял, как избежать ручной функции метод многословно обратного вызова, как описано выше - возможно, позволяя что-то вроде этого:
Jrex.replace(MyString , MyRegex , "\F:DateAdd('h',1,\1)" , 'all')
Было бы хорошо, чтобы услышать, если кто-то имеет мысли об этом.
Заметка о том, почему это не работает: CF передает оценку регулярного выражения на движок Java, который ожидает строки для параметров. Поэтому CF попытается оценить все в строке до того, как это произойдет. Мы все хотим, чтобы вы могли передавать функции, но это не работает. Однако у Гари есть правильная идея. –
Ага - интересный материал. Я думаю, это все, что я действительно хотел узнать, но я не могу отметить комментарий как принятый ответ :-) – stubotnik