我正在看这个正则表达式
<(\\w*)>\\.*</(\\w*)>
通过教程等我理解为阅读,匹配表格后面的任何内容
<tag1>blah</tag1>
即。 XML元素,一些文本和结束XML元素。但是,当我在各种正则表达式检查器上运行时,例如Expresso,它与我认为不应该匹配。
注意:为了进一步复杂化这个正则表达式是在Java中,据我所知,这意味着存在一些细微差别。
我失踪了什么?
赞赏......
由于
答案 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标签匹配