2010-02-02 2 views
0

닫는 XML 태그를 제외하고는 모두 제거하기 위해 정규식을 작성하려고합니다.특정 닫는 태그를 보유하는 Java 정규식

코드는 간단한데 :

String stringToParse = "<body><xml>some stuff</xml></body>"; 
Pattern pattern = Pattern.compile("</[^(a|em|li)]*?>"); 
Matcher matcher = pattern.matcher(stringToParse); 
stringToParse = matcher.replaceAll(""); 

그러나,이 실행될 때, 그것은 닫는 태그 "XML"를 건너 뜁니다. 컴파일 된 그룹 (a | em | li)에 일치하는 문자가있는 태그를 건너 뛰는 것 같습니다. 즉, "li"에서 "l"을 제거하면 작동합니다. "<body><xml>some stuff"(나는 오프닝 태그를 제거하기 위해 추가 분석을하고 있지만, 예를 들어 간단 유지하고) :

나는이 다음과 같은 문자열을 반환 할 것으로 예상합니다.

+0

stringToParse의 최종 값을 원하는대로 명시 적으로 표시하고 대신 무엇을 얻을 수 있습니까? –

+1

이것은 보안에 민감한 일부 작업의 일부로 보입니다. 정규식 아이디어를 잊어 버리고 대신 ** 실제 ** 파서를 사용하는 것이 좋습니다. "stringToParse"라는 변수의 이름을 지정했지만 regex를 사용하면 ** 구문 분석을하지 않습니다 **. – BalusC

답변

4

당신은 아마이 작업에 대한 정규식을 사용하지만, 이제 어떻게되는지 보자 안 ...

귀하의 문제는 당신이 부정 문자 클래스를 사용하고 문자 클래스 내에서 복잡한 표현을 쓸 수 있다는 것입니다 - 문자 만. 당신은 대신에 부정적 예측을 시도 할 수 :

"</(?!a|em|li).*?>" 

을하지만이 제대로 사례 수를 처리하지 않습니다 태그처럼 일을 포함

  • 댓글.
  • 태그를 속성의 문자열로 사용합니다.
  • a, em 또는 li로 시작하지만 실제로는 다른 태그 인 태그.
  • 대문자.
  • 등 ...

당신은 아마 이러한 문제를 해결할 수 있지만, 당신이 가치가있다, 또는 적절한 HTML 파서를 기반으로하는 솔루션을 찾기 위해 더 나을 것인지 여부를 고려할 필요가있다 .

+0

설명과 올바른 방향으로 밀기 위해 +1 – akf

+0

굉장하다, 기호, 설명에 대해 감사합니다. 나는 인물 학급의 그 측면을 이해하지 못했다. –

0

문자 클래스 내에서 교대를 사용할 수 없습니다. 문자 클래스는 항상 단일 문자와 일치합니다. 난 정말 이것에 대한 적절한 파서 (예를 들어, JTidy)를 사용하는 것이

"</(?!a|em|li).*?>" 
1

:

당신은 가능성이 lookbehind 대신에 부정적 예측 또는를 사용하고 싶습니다. XML/HTML은 정규 표현식을 사용하여 구문 분석 할 수 없으며 정규 표현식이 아니기 때문에 XML/HTML을 파싱 할 수 없습니다. 차라리 표준 JDK (JAXP) 또는 적합한 제 3 자 라이브러리 (위 참조)에서 사용 가능한 XML 구문 분석을 사용하여 출력을 적절히 구성하십시오.

더 많은 열정적 인 정보를 보려면 this answer을 참조하십시오. regexps를 통해 XML/HTML을 파싱합니다.

관련 문제