Java 用于在XML元素之间获取文本的正则表达式

Java 用于在XML元素之间获取文本的正则表达式,java,xml,regex,Java,Xml,Regex,我在看这个正则表达式 <(\\w*)>\\.*</(\\w*)> \\* 阅读教程等。我理解为阅读,匹配表格后面的任何内容 <tag1>blah</tag1> 废话 i、 e.一个XML元素、一些文本和一个结束XML元素。然而,当我在各种正则表达式检查器上运行它时,例如Expresso,它与我认为应该的不匹配 注意:为了使事情进一步复杂化,这个正则表达式是用Java编写的,据我所知,这意味着存在一些细微的差异 我缺少什么 任何值得欣赏的东西

我在看这个正则表达式

<(\\w*)>\\.*</(\\w*)>
\\*
阅读教程等。我理解为阅读,匹配表格后面的任何内容

<tag1>blah</tag1>
废话
i、 e.一个XML元素、一些文本和一个结束XML元素。然而,当我在各种正则表达式检查器上运行它时,例如Expresso,它与我认为应该的不匹配

注意:为了使事情进一步复杂化,这个正则表达式是用Java编写的,据我所知,这意味着存在一些细微的差异

我缺少什么

任何值得欣赏的东西

谢谢

使用:

<(\w*)>.*</(\w*)>
*
\\w
–文字
\
,然后
w

\
–literal
\

这就行了

<[^>]*>[^<]*<[^>]*>
]*>[^
匹配没有角括号。但这两个例子都匹配

<tag1>blah</tag2>
<tag1>blah</tag1>
废话
但是您是否需要匹配XML的标记,即

<tag1>blah</tag1>
废话
在这种情况下,您需要一个带有反向引用的解决方案。有关详细信息,请参阅此

此示例使用反向引用

<([^>]*)>[^<]*</\1>

]*)>[^转义仅适用于文字,但有些语言使用
\
来转义字符串中的字符本身,迫使您在字符串中使用
\
,以表示regex中的
\
,并试图实现
\
(regex中的文字
\
)在这样的语言中可以是
\\\\
。我认为这可能是在示例代码中看到
\\
时产生混淆的原因

改进正则表达式:

如果有人想成为灌洗者,并构建一个不规则的表达式,如:

< _some_tag some="stuff" >
    some <strong>content</strong>
< / _some_tag >
<\u some\u tag some=“stuff”>
一些内容

您可以使用这个更通用的正则表达式来捕获标记名、内容和属性

<\s*([A-Za-z_]\w*)\s*([^\>]+)>(.*?)<\s*\/\s\1\s*>
]+)>(*

请注意,
*?
是必需的,以防页面中进一步存在相同的标记,否则保持贪婪将使其捕获所有内容,直到最后一个同名标记关闭。另外,
blah
显然是假的,但是如果你想拥有这种灵活性,你可以只更改这个正则表达式的最后一部分。

你的基本问题是你的正则表达式是“贪婪的”,这意味着它将从第一个标记匹配到最后一个标记,包括嵌套的标记。要使其非贪婪,请使用非贪婪语法
*?
(而不是
*

另一个问题是您需要匹配标记-使用“反向引用”:
\1
表示“第一个捕获的组”

此正则表达式应该执行以下操作:

<(\w+)>.*?</\1>
*?
它在匹配的打开/关闭标记之间使用非贪婪捕获


虽然您使用的是java,但为了使正则表达式可读,我省略了反斜杠转义
\\

与其他使用正则表达式访问XML的尝试一样,您的尝试是错误的。有两种错误:它不会匹配编写这段XML的所有合法方式(您检查过标签中允许使用空格吗?),它会匹配一些不应该匹配的内容(例如,看起来像XML但在注释或CDATA部分中的内容)

现在有些情况下,错误的代码是可以接受的,例如,如果你正在抓屏,并且对80%的成功率感到满意。但如果是这种情况,您需要将其作为解决方案的明确要求进行说明

您永远无法获得100%的成功率的原因是XML不是一种常规语言。这是一个专业术语。一些基本的计算机科学理论告诉你,正则表达式只能用于处理正则语言


您可能会发现使用XML解析器速度更快。我曾经有一个系统执行速度太慢了30倍,通过正确的解析替换正则表达式代码解决了这个问题。

您在java中使用正则表达式吗?你是指
blah
还是
blah
(注意结束标记名)?@波希米亚人纠正了拼写错误,并澄清了这是java。
<(\w+)>.*?</\1>