【问题标题】:Regex search in a file文件中的正则表达式搜索
【发布时间】:2015-04-18 09:50:22
【问题描述】:

我有这个任务:我必须读取一个 HTML 文件并将所有 <a> 标记与其所有属性匹配并打印出来。例如:对于标签:
<a href="https://www.facebook.com" alt="Facebook icon" title="Facebook" target="_blank"></a>

待打印:

href -  https://www.facebook.com   
alt -  Facebook icon  
title -  Facebook  
target- _blank  
text – not found  

我有 正规表达式 的基本知识和从 java 中读取文件的零知识。有人可以就如何有效地做到这一点给我一些提示、建议和解释吗?
在我看来,将<a> 标记与所有属性和结束</a> 匹配的正则表达式可能是:

"\<[aA]\w\>\w\<\/[aA]\>*"

【问题讨论】:

  • 你为什么不试试解析器?
  • 您可能想看看这个问题及其最佳答案:stackoverflow.com/questions/1732348/…
  • 不要为此使用正则表达式。使用 HTML 解析器(例如 jsoup)。
  • 我必须使用正则表达式。练习正则表达式是一项功课。
  • 把这个给你的老师看:stackoverflow.com/a/1732454/1393766 并询问真正应该使用正则表达式的任务。 HTML 和 regex 不是很好的组合,因为在 html 中,标签属性的顺序可以随时更改,而且属性值也不能保证用" 包围,我们也可以用' 包围它,这使得潜在的 regex 更加复杂.对于解析 HTML,我们应该使用... parser.

标签: java regex file


【解决方案1】:

就像其他人所说,不要使用正则表达式解析 html 文件。如果您愿意,那么您可以尝试以下基于\G 锚点的正则表达式。

String s = "<a href=\"https://www.facebook.com\" alt=\"Facebook icon\" title=\"Facebook\" target=\"_blank\"></a>";
Matcher m = Pattern.compile("(?:<a|(?<!^)\\G)\\s+(\\w+)=\"([^\"]*)\"")
        .matcher(s);
while (m.find()) {
    System.out.println(m.group(1) + "\t-\t" + m.group(2));
}

输出:

href    -   https://www.facebook.com
alt     -   Facebook icon
title   -   Facebook
target  -   _blank

DEMO

参考\G锚点:

【讨论】:

  • 好的。这工作得很好。谢谢!剩下的就是如何逐行读取文件并打印所有&lt;a&gt; 标签。这个\G 锚是否划分属性和它的值?然后用m.group(1) 打印属性,m.group(2) 打印值?我理解正确吗?
  • @LeoZhekov 添加了一些参考资料。从中您可以了解\G锚点的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多