Java中的正则表达式,查找开始和结束标记

时间:2009-02-04 17:15:08

标签: java html regex matcher

我正在尝试在HTML文档中查找数据。我不需要一个完整的解析器,因为它只是一个标签之间的数据。

但是,我想检测'select'标签及其间的数据。

return Pattern.compile(pattern, 
                       Pattern.CASE_INSENSITIVE | Pattern.MULTILINE |
                       Pattern.DOTALL);

/// End right angle bracket left off intentionally:
track_pattern_buf.append("<select");
track_pattern_buf.append("(.*?)");
track_pattern_buf.append("</select");

这是你要使用的'正则表达式'吗?

5 个答案:

答案 0 :(得分:5)

如果你真的想用正则表达式(这不是最好的选择),我会使用:

"<select[^>]*>(.+?)</select\s*>"

答案 1 :(得分:1)

我会使用类似的东西:

"<select>([^<>]+)</select>"

我不确定你为什么不离开'&gt;'并且我不想匹配其他标签(这里我假设我们正在寻找文本数据而不是文档片段)。

话虽这么说,我真的会考虑获取一个DOM并使用XPath(或类似的)来进行查询,因为正则表达式不是well known for their ability to deal with trees

答案 2 :(得分:0)

我认为更安全的是拥有类似的东西:

"<\s*select\s*>(.*?)<\s*/select\s*>"

为了提高安全性,您应该在第一次选择后添加\ w *,以防出现任何其他选择选项。

如果您的HTML符合标准,则可能会跳过第3个\ s *。

答案 3 :(得分:0)

我知道你认为你不需要一个完整的解析器 - 我们都在某个时候编写了一个HTML正则表达式解析器,认为“我的用例非常简单,当然我可以使用正则表达式这个< / em>时间!“

但我认为所有已经离开并完成它的人最终得出的结论是,将繁重的工作外包给许多优秀的现有解析器之一会更快,更容易,更简单,更安全。我知道我有。

查看jSoup - 它很简单,速度很快,而且很有效。没有充分的理由不使用它。

如果你仍然不相信,你必须来问问正确的模式是什么 - 你得到了三个不同的答案 - 没有一个完成整个工作 - 应该说这个问题比初看起来要复杂得多。

答案 4 :(得分:0)

根据您的需要,我还建议您做一个负面的预测,以确保您在第一次选择时停止。

"(?<selectGroupName><select>((?:(?!select).)*)</select>)"

这里的重要部分是“((?:(?!select)。)*)”它采取任何不与负面预测相冲突的事情。

使用惰性量词也可以实现同样的目的:

"(?<selectGroupName><select>(.*?)</select>)"

这些都可以确保您在第一次出现时停止阻止您同时拍摄多个部分。但它确实不会保护您免受嵌套的选择标记的影响,相反,这会导致此表达式出现问题。 使用此表达式将是一个问题:

<select>
    <select>
    </select>
</select>

如果没有前瞻或懒惰的量词,以下将是一个问题:

<select>
</select>
<a>
    <select>
    </select>
</a>