Szukaj…


Wprowadzenie

Jeśli chcesz czegoś więcej niż prostego zastąpienia łańcucha zwykłymi wyrażeniami regularnymi, na pewno napotkasz problemy i uderzysz w ścianę, odkrywając granice funkcji wyrażenia regularnego, jakie ma Coldfusion. Nie ma wbudowanej funkcji takiej jak phg's preg_replace_callback .

Parametry

Parametr Detale
re Wyrażenie regularne
str Ciąg, który powinien być zastosowany w wyrażeniu regularnym
callback Funkcja, w której przechwycone zgrupowane zostaną przekazane, jeśli znaleziono dopasowanie. Tam dopasowania mogą być przetwarzane

Uwagi

Ponieważ sama Coldfusion nie oferuje tego, czego chcemy, uciekamy się do różnorodności Java, która - jak wszyscy wiemy - jest na szczycie Coldfusion. Java oferuje nam java.util.regex.Pattern .

Oto, co faktycznie robimy:

  1. Wywołaj metodę Compile z obiektu klasy Pattern i przekazując mu wzorzec wyrażenia regularnego (który prawdopodobnie umieszcza wzorzec wyrażenia regularnego do późniejszego użycia).
  2. Wywołaj metodę Matcher na podstawie tego, co zwróciła metoda Compile , i przekazując ciąg, w którym należy wykonać wzorzec.
  3. Sprawdź, czy dopasowanie zakończyło się powodzeniem, wywołując metodę find na podstawie tego, co zwróciła metoda Matcher .

Jeśli matcher.find() zwróci wartość true , moglibyśmy powiedzieć „To jest to”, ale jest jedna drobna rzecz, którą musimy wziąć pod uwagę: Obiekt Pattern języka Java przechowuje grupy i daje nam dostęp za pośrednictwem innej funkcji, co nie zawsze jest najlepszym sposobem na dalsze przetwarzanie i niespójne pod względem sposobu obsługi tego przypadku przez inne języki programowania. Dlatego zapętlamy matcher.group() , abyśmy mogli przekazać tablicę zawierającą przechwycone grupy do funkcji wywołania zwrotnego. A teraz możemy powiedzieć: „To jest to!”

Zdefiniowana przez użytkownika funkcja 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);
    }
}

Korzystanie z funkcji 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow