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

时间:2012-02-23 12:19:12

标签: java xml regex

我正在看这个正则表达式

<(\\w*)>\\.*</(\\w*)>

通过教程等我理解为阅读,匹配表格后面的任何内容

<tag1>blah</tag1>

即。 XML元素,一些文本和结束XML元素。但是,当我在各种正则表达式检查器上运行时,例如Expresso,它与我认为不应该匹配。

注意:为了进一步复杂化这个正则表达式是在Java中,据我所知,这意味着存在一些细微差别。

我失踪了什么?

赞赏......

由于

5 个答案:

答案 0 :(得分:5)

使用:

<(\w*)>.*</(\w*)>

\\w - 文字\,然后w
\\ - 文字\

答案 1 :(得分:3)

只有文字才需要转义,但有些语言使用\来转义字符串本身的字符,迫使你在字符串中使用\\来表示正则表达式中的\。在这些语言中,尝试启用\\(正则表达式中的文字\)可以\\\\。我认为这可能是在示例代码中看到\\时混淆的原因。

改进正则表达式:

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

< _some_tag some="stuff" >
    some <strong>content</strong>
< / _some_tag >

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

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

请注意,如果页面中存在相同的标记,则需要.*?,否则保持贪婪将使其捕获所有内容,直到具有该名称的最后一个标记关闭。另外<tag1>blah</tag2>显然是假的,但如果你想要灵活,你可以改变这个正则表达式的最后部分。

答案 2 :(得分:2)

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

另一个问题是你需要匹配你的标签 - 使用“后退参考”:\1表示“第一个被捕获的组”。

这个正则表达式应该这样做:

<(\w+)>.*?</\1>

它使用匹配打开/关闭标记之间的非贪婪捕获。

虽然您使用的是java,但我将反斜杠的转义省略为\\以使regxes可读。

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:1)

这样可行

<[^>]*>[^<]*<[^>]*>

匹配没有倾斜支架。但这两个例子都匹配

<tag1>blah</tag2>

但是你想要XML的匹配标签吗?

<tag1>blah</tag1>

在这种情况下,您需要一个带后向引用的解决方案。有关详细信息,请参阅此SO question

此示例使用反向引用

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

所以匹配

<tag1>blah</tag1>

但不是

<tag1>blah</tag2>

我知道这不是你问的,但我认为你想要XML标签匹配