java에서 replaceAll 함수를 이용하여 문자열 내의 태그 제거하기

    /**
     * 주어진 문자열에서 태그를 모두 제거한다.
     * @param str 원본 문자열
     * @param replacement 대체할 문자열
     * @return
     */
    public static String replaceTag(String str, String replacement) {

        // <로 시작. /가 0번 또는 1번 나옴. (a-zA-Z문자가 0번 이상)이 한 묶음.
        // (\s 공백문자. a-Z문자가 0번 이상. = 나옴. > 제외한 문자 0번 이상.)이 한 묶음으로 0번 또는 1번 나옴. <- 태그 다음 공백부터 > 전까지. ==> 속성
        // 공백 0번 이상. /가 0번 또는 1번. >로 끝.
        // ex) <a href="www.naver.com" title="title" >NAVER</a>
        return str.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", replacement);
    }

    /**
     * 주어진 문자열에서 a 태그를 제외한 태그를 모두 제거한다.
     * @param str 원본 문자열
     * @param replacement 대체할 문자열
     * @return
     */
    public static String replaceTagExceptA(String str, String replacement) {

        // /aA 또는 aA가 아닌 것으로 시작하는 모든 태그
        return str.replaceAll("<(?!(/[aA])|([aA])).([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", replacement);
    }

?! 사용해야 하는 걸 알아내느라 애먹었다.
참고: http://nosyu.pe.kr/1139

(?<=.....) : 긍정형 룩비하인드 - 하위 표현식(..... 부분)이 왼쪽에 매치될 때
(?<!.....) : 부정형 룩비하인드 - 하위 표현식(..... 부분)이 왼쪽에 매치되지 않을 때
(?=.....) : 긍정형 룩어헤드 - 하위 표현식(..... 부분)이 오른쪽에 매치될 때
(?!.....) : 부정형 룩어헤드 - 하위 표현식(..... 부분)이 오른쪽에 매치되지 않을 때

(?!(/[aA])|([aA])). 에서와 같이 /a /A 또는 a A 와 매치하지 않는 것을 찾아내는 정규표현식임.