String input = getJSPString();
final Pattern p = Pattern.compile(
"\".*?(?<!\\\\)\"|" + // ignore string literals
"(?s)<%--.*?--%>|" + // ignore JSP comments
"<!--(.*?)-->"); // capture HTML comments in group #1
Matcher m = p.matcher(input);
StringBuffer sb = new StringBuffer();
while (m.find()) {
if (m.group(1) != null) {
m.appendReplacement(sb, "<%--$1--%>");
}
}
m.appendTail(sb);
String output = sb.toString();
당신은 당신의 소스가 HTML의 혼합이다 언급,이 변화 HTML 태그 도입 수있는 합병증을 제거
을 제공 할 수 있습니다.
원자 그룹과 \G
앵커를 추가하면
스택 오버플로의 위험이 거의 없습니다.
원시 정규식 교체 :
\G((?><(?:script(?:\s+(?:"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])*?)+)?\s*>[\S\s]*?</script\s*|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:(?:(?:"[\S\s]*?")|(?:'[\S\s]*?'))|(?:[^>]*?))+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?)))|%--[\S\s]*?--%)>|(?!<!--[\S\s]*?-->)[\S\s])*)<!--([\S\s]*?)-->
연극, 정규식을 :
"\\G((?><(?:script(?:\\s+(?:\"[\\S\\s]*?\"|'[\\S\\s]*?'|(?:(?!/>)[^>])*?)+)?\\s*>[\\S\\s]*?</script\\s*|(?:/?[\\w:]+\\s*/?)|(?:[\\w:]+\\s+(?:(?:(?:\"[\\S\\s]*?\")|(?:'[\\S\\s]*?'))|(?:[^>]*?))+\\s*/?)|\\?[\\S\\s]*?\\?|(?:!(?:(?:DOCTYPE[\\S\\s]*?)|(?:\\[CDATA\\[[\\S\\s]*?\\]\\])|(?:ATTLIST[\\S\\s]*?)|(?:ENTITY[\\S\\s]*?)|(?:ELEMENT[\\S\\s]*?)))|%--[\\S\\s]*?--%)>|(?!<!--[\\S\\s]*?-->)[\\S\\s])*)<!--([\\S\\s]*?)-->"
을 확장/포맷 :
\G # G anchor
( # (1 start)
(?> # Atomic group start
< # Begin a Tag <, but not an html comment
(?:
script # Script
(?:
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! />)
[^>]
)*?
)+
)?
\s* >
[\S\s]*? </script \s*
| # or,
(?: # Non-attribute
/?
[\w:]+
\s*
/?
)
| # or,
(?: # Attribute
[\w:]+
\s+
(?:
(?:
(?: " [\S\s]*? ")
| (?: ' [\S\s]*? ')
)
| (?: [^>]*?)
)+
\s*
/?
)
| # or,
\? # <? ?> form
[\S\s]*?
\?
| # or,
(?: # Misc <! > forms
!
(?:
(?:
DOCTYPE
[\S\s]*?
)
| (?:
\[CDATA\[
[\S\s]*?
\]\]
)
| (?:
ATTLIST
[\S\s]*?
)
| (?:
ENTITY
[\S\s]*?
)
| (?:
ELEMENT
[\S\s]*?
)
)
)
| # or,
%-- [\S\s]*? --% # JSP comment
)
> # End a Tag >
| # or,
# A character that does
# not begin a html comment
(?! <!-- [\S\s]*? -->)
[\S\s]
)* # Atomic group end, 0 to many times
) # (1 end)
<!--
([\S\s]*?) # (2), Finally, the Html comment
-->
출처
2016-08-02 17:25:19
sln
는 "나는 내 요구 사항에 대한 정규식을 찾기 위해 노력했다,하지만 난 하나를 찾을 수 없습니다." - 정규 표현식이 HTML과 같은 비정규 문제 영역에 적합하지 않은 이유의 예입니다 (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -contained-tags/1732454 # 1732454) 등등. 조건 1과 2를 다루는 표현식을 만들 수 있습니다. (상당히 복잡 할 수도 있습니다.) 그리고 조건 3을 만나게됩니다. 문제 영역을 이해하는 파서를 사용하십시오. (귀하의 경우 JSP 코드). – Thomas
이것이 html과 JSP가 혼합 된 것이라면 그 이상이 필요할 것입니다. 그것은 혼합인가? – sln
@sln 예입니다. – kakurala