当模式位于另一个模式

时间:2016-08-02 16:13:13

标签: java regex jsp

我试图找到我的要求的正则表达式,但我找不到一个。 如果有人遇到这个,请帮助我。

例如,如果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解决方案。

3 个答案:

答案 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();

Ideone Demo

答案 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)

你可以使用这种模式

(<!(--(?:[^-]|-(?!->))*?--)>)(?!((?!<%--)[\s\S])*?--%>)

并替换w / <%$2%>
Demo