Java 当某个图案位于另一个图案内时排除该图案

Java 当某个图案位于另一个图案内时排除该图案,java,regex,jsp,Java,Regex,Jsp,我想根据我的要求找到一个正则表达式,但找不到。 如果有人遇到这个,请帮助我 例如,如果html注释位于JSP注释内,则不要触摸它,否则将其设置为JSP注释 Condition: 1 <!-- normal HTML comment --> with <%-- normal HTML comment --%> 条件:1 具有 但与JSP注释中的HTML注释不匹配,如下所示 Codition: 2 <%-- normal JSP comment

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

例如,如果html注释位于JSP注释内,则不要触摸它,否则将其设置为JSP注释

Condition: 1
<!-- normal HTML comment -->

with 

<%-- normal HTML comment --%>
条件:1
具有
但与JSP注释中的HTML注释不匹配,如下所示

Codition: 2
<%-- normal JSP comment 

     <!-- inside html comment here -->
      other comment stuff
 <!-- another inside html comment here -->

--%>
Codition:2
--%>

非常感谢java解决方案。

当尝试匹配上下文“X”或上下文“Y”中不存在的内容时,我总是使用来自的公式。诀窍是在备选方案的最右侧创建一个捕获组,其中包含您想要的内容,而在备选方案的左侧创建您不想要的所有其他上下文

此外,正则表达式需要忽略字符串文本。您的正则表达式如下所示:


“*?(?您提到您的源代码是html混合,我将提供此变体
这消除了html标记可能带来的任何复杂性

添加原子群和
\G

堆栈溢出的风险很小

替换为
$1

原始正则表达式:

\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]*?)-->"
在本次会议上,除了除了上述两个国家的代码以外,其他一些国家的政府在上述两个国家的政府在上述两个国家的政府在上述两个国家的政府在上述两个国家的政府在上述上述两个国家的代码除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了之外之外之外之外之外之外之外之外之外之外之外之外之外之外之外之外之外的其他其他其他其他以外以外以外以外以外的其他其他其他其他以外的其他其他其他其他其他其他其他以外以外以外以外以外以外以外以外以外的其他其他其他以外的其他其他以外的其他其他其他以外以外以外以外的其他以外以外的其他其他以外以外的其他以外以外以外以外以外的其他其他其他其他其他其他其他[\\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
 -->
\G#G锚
(#(1开始)
(?>#原子组开始
<#开始标记)
[^>] 
)*?
)+
)?
\s*>
[\S\S]*?]*?)
)+
\s*
/? 
)
|#或,
\?#形式
[\S\S]*?
\?
|#或,
(?:#其他表格
!
(?:
(?:
DOCTYPE
[\S\S]*?
)
|  (?:
\[CDATA\[
[\S\S]*?
\]\]
)
|  (?:
名单
[\S\S]*?
)
|  (?:
实体
[\S\S]*?
)
|  (?:
元素
[\S\S]*?
)
)
)
|#或,
%--[\S\S]*?--%#JSP注释
)
>#结束标签>
|#或,
#一个角色
#不开始html注释
(?!  )
[\S\S]
)*#原子组结束,0到多次
)#(一完)

您可以使用此模式

(<!(--(?:[^-]|-(?!->))*?--)>)(?!((?!<%--)[\s\S])*?--%>)
(?!(?!) 并替换为w/


“我试图为我的需求找到一个正则表达式,但我找不到。”-这是etc的一个例子。您可能可以创建一个处理条件1和2的表达式(可能会变得非常复杂),然后遇到条件3等。最好使用理解问题域的解析器(您的例子中的JSP代码)。如果这是html和JSP的混合,你需要的不仅仅是这些。这是混合吗?@kakurala-如果是,使用正则表达式会有点棘手。你永远不会得到防弹的正则表达式解决方案,例如
String foo=“@4castle
String foo=“\”假设我们有n个这样的模式,那么条件/表达式的组合会很复杂。有什么捷径吗?@JavaHopper要忽略多个上下文,只需继续添加到左侧。所以
notThis | orThis | evenThis |(WeWantThis)
谢谢@4castle的技巧,但在这里它不起作用。相反,它会匹配所有html注释,而不管它在哪里。@kakurala这是有意的。你必须检查捕获组。一个普通的
字符串35; replace
无法完成这项工作。@kakurala我更新了我的答案来说明如何做。什么会导致堆栈溢出?I没有看到任何递归现象。@4castle-除了Java正则表达式的实现是递归性质外,我不太了解其他事实。我想这包括回溯。谷歌it,到处都是。@sln,谢谢你的努力。我尝试了4castle版本的代码,但做了一些修改,它符合我的要求。@kakurala-你是w埃尔康,我要把这个贴出来给需要解决方案的人。
(<!(--(?:[^-]|-(?!->))*?--)>)(?!((?!<%--)[\s\S])*?--%>)