我试图找到我的要求的正则表达式,但我找不到一个。 如果有人遇到这个,请帮助我。
例如,如果html注释在JSP注释中,则不要触摸它,否则将其作为JSP注释。
Condition: 1
<!-- normal HTML comment -->
with
<%-- normal HTML comment --%>
但是不要匹配JSP注释中的HTML注释,如下所示。
Codition: 2
<%-- normal JSP comment
<!-- inside html comment here -->
other comment stuff
<!-- another inside html comment here -->
--%>
非常感谢java解决方案。
答案 0 :(得分:1)
当试图匹配上下文中没有的东西&#34; X&#34;或上下文&#34; Y&#34;,我总是使用The Greatest Regex Trick Ever中的公式。诀窍是在交替的最右侧创建一个捕获组,它具有您想要的内容,以及您在交替的左侧不想要的所有其他上下文。
此外,正则表达式需要忽略字符串文字。你的正则表达式看起来像:
".*?(?<!\\)"|(?s)<%--.*?--%>|<!--(.*?)-->
然后,如果有第一个捕获组,代码只会替换字符串。
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();
答案 1 :(得分:0)
你提到你的来源是一个html混合,我会提供这种变化
这消除了html标签可能引入的任何复杂情况。
添加原子组和Contract(playerCode)-->Player(code)
Contract(teamName)-->Team(name)
锚点
堆栈溢出的风险很小。
替换为\G
Raw Regex:
$1<%--$2--%>
Stringed Regex:
\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]*?)-->"
答案 2 :(得分:0)