수색…


소개

ColdFusion에서 제공하는 정규식 함수의 한계를 발견했을 때 일반적인 정규 표현식으로 간단한 문자열 교체 이상을 원한다면 확실히 문제가 발생하여 벽에 부딪 힐 수 있습니다. PHP의 preg_replace_callback 과 같은 빌드 인 기능은 없습니다.

매개 변수

매개 변수 세부
re 정규 표현식
str 정규식에 적용해야하는 문자열
callback 일치하는 항목이 발견되면 캡처 된 그룹화가 전달되는 함수입니다. 거기서 경기가 처리 될 수 있습니다.

비고

ColdFusion 자체가 우리가 원하는 것을 제공하지 않기 때문에 우리는 Coldfusion 위에있는 다양한 자바에 의존합니다. Java는 java.util.regex.Pattern 제공합니다.

여기 실제로 우리가하는 일이 있습니다 :

  1. Pattern 클래스 객체에서 Compile 메서드를 호출하고 정규식 패턴을 전달하면 (나중에 사용할 수 있도록 정규식 패턴이 저장됩니다).
  2. Compile 메서드가 반환 한 내용에 대해 Matcher 메서드를 호출하고 패턴을 실행해야하는 문자열을 전달합니다.
  3. Matcher 메소드가 돌려주는 것에 find 메소드를 호출하는 것에 의해, 매칭이 성공했는지 어떠했는지를 테스트합니다.

matcher.find()true 반환하면 "That 's it"이라고 말할 수 있습니다.하지만 고려해야 할 사항이 하나 있습니다. Java의 Pattern 객체는 그룹을 저장하고 다른 함수를 통해 액세스 할 수있게 해주므로 항상 최선의 방법은 아닙니다. 다른 프로그래밍 언어가이 경우를 어떻게 다루는 지에 대해서는 일관성이 없다. 따라서 우리는 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