Поиск…


Вступление

Если вам нужна более простая замена строки с помощью обычных регулярных выражений, вы наверняка столкнетесь с проблемами и попадете в стену, когда обнаружите пределы функций регулярного выражения, которые имеет Coldfusion. Нет встроенной функции, такой как preg_replace_callback php.

параметры

параметр подробности
re Регулярное выражение
str Строка, которая должна быть применена в регулярном выражении
callback Функция, в которой захваченная группа будет передана, если совпадение найдено. Там матчи могут быть обработаны

замечания

Поскольку Coldfusion сам не предлагает то, что мы хотим, мы прибегаем к многообразию Java, которое, как мы все знаем, находится поверх Coldfusion. Java предлагает нам java.util.regex.Pattern .

Итак, вот что мы на самом деле делаем:

  1. Вызвать метод Compile из объекта класса Pattern и передать ему шаблон регулярного выражения (что, вероятно, откладывает шаблон регулярного выражения для последующего использования).
  2. Matcher метод Matcher о том, что возвращает метод Compile и передавая строку, в которой должен выполняться шаблон.
  3. Протестируйте, если совпадение прошло успешно, вызвав метод find по Matcher возвращался метод Matcher .

Если matcher.find() возвращает true , мы могли бы сказать «Вот оно», но есть одна маленькая вещь, которую мы должны учитывать: объект Java Java хранит группы и дает нам доступ через другую функцию, что не всегда является лучшим способом для дальнейшая обработка, а не то, что согласуется с тем, как другие языки программирования обрабатывают этот случай. Поэтому мы перебираем matcher.group() чтобы мы могли передать массив, содержащий захваченные группы, функции обратного вызова. И теперь мы можем сказать: «Вот и все!»

Определенная пользователем функция REReplaceCallback

function REReplaceCallback(re,str,callback) {
    /*
        Thanks to Ben Nadel
        "Learning ColdFusion 8: REMatch() For Regular Expression Matching"
        from 2007-06-13
        https://www.bennadel.com/blog/769-learning-coldfusion-8-rematch-for-regular-expression-matching.htm
    */
    pattern = CreateObject("java","java.util.regex.Pattern").Compile(Arguments.re);
    matcher = pattern.Matcher(Arguments.str);
    if(matcher.find()) {
        groups = [];
        for(var i = 1; i lte matcher.groupCount(); i++) {
            ArrayAppend(groups,matcher.group(Val(i)));
        }
        return Arguments.callback(groups);
    }
    else {
        return Arguments.callback(false);
    }
}

Использование функции REReplaceCallback

REReplaceCallback('YOUR REGEX GOES HERE','AND YOUR STRING HERE',function(groups) {
    //now you can access the 'groups' array containing all the captured groups
    return result; //return whatever you've processed inside
});


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow