我正在尝试在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");
这是你要使用的'正则表达式'吗?
答案 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>