Java Regex 检查字符串是不是包含 XML 标记
Posted
技术标签:
【中文标题】Java Regex 检查字符串是不是包含 XML 标记【英文标题】: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 对不起,我不明白?我只是想验证在提供的字符串中我有<somenode>
或</somenode>
。我是否只能验证是否存在其中一个都没关系。
【参考方案1】:
这个:
if (input.matches("(?s).*(<(\\w+)[^>]*>.*</\\2>|<(\\w+)[^>]*/>).*"))
匹配两种类型的标签(标准和自动关闭):
<abc foo="bar">blah</abc>
<abc foo="bar"/>
不匹配不完整的标签,例如:
<abc>
见regex live demo。
【讨论】:
如果您添加另一个反斜杠,Regex 可以正常工作。所以</\\2>
而不是</\2>
【参考方案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 有多复杂。以上是关于Java Regex 检查字符串是不是包含 XML 标记的主要内容,如果未能解决你的问题,请参考以下文章
Javascript Regex 检查 URL 是不是包含一个单词并且不包含另一个单词
在 C# 中使用“Regex”检查字符串数组中是不是存在元素
Java:String.replace(regex, string) 从 XML 中删除内容