1

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

但是,我想检测“选择”标签和介于两者之间的数据。

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");

这是您将使用的“正则表达式”吗?

4

5 回答 5

5

如果您真的想使用正则表达式进行拼接(这不是最佳选择),我会使用:

"<select[^>]*>(.+?)</select\s*>"
于 2009-02-04T17:31:32.907 回答
1

我会使用看起来像这样的东西:

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

我不确定您为什么不使用“>”并且我不想匹配其他标签(这里我假设我们正在寻找文本数据而不是文档片段)。

话虽这么说,我真的会考虑获取一个 DOM 并使用 XPath(或类似的)来进行查询,因为正则表达式的处理能力并不为人所知

于 2009-02-04T17:28:14.877 回答
0

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

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

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

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

于 2009-02-04T17:31:32.750 回答
0

我知道您认为您不需要一个成熟的解析器 - 我们都曾在某个时候编写过 HTML 正则表达式解析器,并认为“我的用例非常简单,这次我肯定可以使用正则表达式!”

但我认为每个完成它的人最终都会得出结论,将繁重的工作外包给现有的众多优秀解析器之一会更快、更容易、更简单和更安全。我知道我有。

查看jSoup - 它简单、快速且有效。真的没有充分的理由不使用它。

如果您仍然不相信,那么您必须来询问正确的模式是什么这一事实-您得到了三个不同的答案作为回应-没有一个可以完成整个工作-应该说明问题要复杂得多比乍一看似乎。

于 2012-08-07T19:48:45.867 回答
0

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

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

这里的重要部分是“((?:(?!select).)*)”,它接受任何不与否定前瞻冲突的内容。

同样也可以通过使用惰性量词来完成:

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

这些都将确保您将在第一次出现阻止您同时参加多个部分时停止。然而,它并不能保护您免受嵌套选择标签的影响,相反,这些标签会导致此表达式出现问题。使用此表达式,以下将是一个问题:

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

如果没有前瞻或惰性量词,则会出现以下问题:

<select>
</select>
<a>
    <select>
    </select>
</a>
于 2013-09-03T13:36:38.387 回答