【问题标题】:Java Regex check if string contains XML tagJava Regex 检查字符串是否包含 XML 标记
【发布时间】:2015-09-29 13:41:02
【问题描述】:

我正在尝试使用String.match() 函数确定一个字符串是否至少包含一个 XML 标记。由于项目的设置方式,我宁愿不必使用Pattern

目前我使用这个正则表达式:

<[A-Za-z0-9]+>

这显然只检查字符串是否具有包含文本的左右箭头括号。我需要的是一种方法来检查字符串是否只有一个带有正则表达式的 XML 标记,例如输入:

blah <abc foo="bar">blah</abc> blah
blah <abc foo="bar"/>

但不能像这样输入:

blah <abc> blah
blah <abc </abc> blah

这可能吗?

【问题讨论】:

  • 使用 Find 函数,我认为 match 意味着正则表达式必须匹配整个字符串。另外,xml tag 是什么意思?打开、关闭还是其他形式?
  • @sln 啊,我假设正则表达式也可以进行部分匹配。我的意思是标签,没关系。我只需要验证至少有一个 xml 节点。
  • 但是一个带有闭包的 node 呢?这不是验证。
  • @sln 对不起,我不明白?我只是想验证在提供的字符串中我有&lt;somenode&gt;&lt;/somenode&gt;。我是否只能验证是否存在其中一个都没关系。

标签: java regex xml


【解决方案1】:

这个:

if (input.matches("(?s).*(<(\\w+)[^>]*>.*</\\2>|<(\\w+)[^>]*/>).*"))

匹配两种类型的标签(标准和自动关闭):

<abc foo="bar">blah</abc>
<abc foo="bar"/>

不匹配不完整的标签,例如:

<abc>

regex live demo

【讨论】:

  • 如果您添加另一个反斜杠,Regex 可以正常工作。所以&lt;/\\2&gt; 而不是&lt;/\2&gt;
【解决方案2】:

好的,这个正则表达式将匹配大多数 html/xml 标签。
大概只需要节点标签,剩下的可以剥掉。

只是 node 标签(最终编辑) -

 # "(?s)<(?:/?[\\w:]+\\s*|[\\w:]+(?:\".*?\"|'.*?'|[^>]*?)+)>"

 (?s)
 <
 (?:
      /?
      [\w:]+ 
      \s* 
   |  
      [\w:]+ 
      (?: " .*? " | ' .*? ' | [^>]*? )+
 )
 >

完整 -

Formatted:

 # "<(?:(?:/?[\\w:]+\\s*/?)|(?:[\\w:]+\\s+(?:(?:(?:\"[\\S\\s]*?\")|(?:'[\\S\\s]*?'))|(?:[^>]*?))+\\s*/?)|\\?[\\S\\s]*?\\?|(?:!(?:(?:DOCTYPE[\\S\\s]*?)|(?:\\[CDATA\\[[\\S\\s]*?\\]\\])|(?:--[\\S\\s]*?--)|(?:ATTLIST[\\S\\s]*?)|(?:ENTITY[\\S\\s]*?)|(?:ELEMENT[\\S\\s]*?))))>"

 <
 (?:
      (?:
           /? 
           [\w:]+ 
           \s* 
           /? 
      )
   |  
      (?:
           [\w:]+ 
           \s+ 
           (?:
                (?:
                     (?: " [\S\s]*? " )
                  |  (?: ' [\S\s]*? ' )
                )
             |  (?: [^>]*? )
           )+
           \s* 
           /? 
      )
   |  
      \?
      [\S\s]*? 
      \?
   |  
      (?:
           !
           (?:
                (?:
                     DOCTYPE
                     [\S\s]*? 
                )
             |  (?:
                     \[CDATA\[
                     [\S\s]*? 
                     \]\]
                )
             |  (?:
                     --
                     [\S\s]*? 
                     --
                )
             |  (?:
                     ATTLIST
                     [\S\s]*? 
                )
             |  (?:
                     ENTITY
                     [\S\s]*? 
                )
             |  (?:
                     ELEMENT
                     [\S\s]*? 
                )
           )
      )
 )
 >

【讨论】:

    【解决方案3】:

    你可以使用:

    if (input.matches("(?s).*?<(\\S+?)[^>]*>.*?</\\1>.*")) {
        // String has a XML tag
    }
    

    (?s)DOTALL 标志以使 DOT 也匹配换行符。

    RegEx Demo

    【讨论】:

    • 如果元素有属性,这个正则表达式会失败。不过,目前尚不清楚请求者正在寻找的 XML 有多复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多