【问题标题】:Java regex to parse /robots.txt用于解析 /robots.txt 的 Java 正则表达式
【发布时间】:2017-03-07 13:55:16
【问题描述】:

我正在尝试找到一个合适的正则表达式来解析 robots.txt 文件。

所以我正在做的是将页面变成一个看起来像这样的字符串,例如:

User-agent: *
Disallow: /a
Disallow: /b/c
Disallow: /d/c/h

User-agent: agent1
Disallow: /a1/c1
Disallow: /b1/d1

User-agent: agent2
Disallow: /a2/c2
Disallow: /b2/d2

所以我要做的是创建一个 regex 来为每个用户代理获取代理名称 (*,agent1,agent2) 及其禁止列表。

这是我尝试过的代码,但没有得到预期的结果:

public void parseRobotsTxt() {
    String website = "http://http://www.EXAMPLE.com";
    String content = PageUtils.getStringSource(website + "/robots.txt");

    Pattern pattern = Pattern.compile(".*?User-agent:(.*?)(Disallow:(.*?))",Pattern.DOTALL);
    Matcher matcher = pattern.matcher(content);
    while (matcher.find()) {
        System.out.println("The user agent:" + matcher.group(1));
        System.out.println("Disallow List: ");
        System.out.println("The user agent:" + matcher.group(2));
        System.out.println("----------------------");
    }

}

不幸的是我得到的结果是

The user agent: *    
Disallow List: 
Disallow:
----------------------
The user agent: agent1
Disallow List: 
Disallow:
----------------------
The user agent: agent2    
Disallow List: 
Disallow:
----------------------

我得到的是代理名称,但不是禁止列表。

【问题讨论】:

  • 会不会更容易:按换行符拆分 - 检查第一行是否以 User-agent: 开头并将其提取 - 而行以 Disallow 开头将它们添加到您的记录中 - 当一个空满足线,开始新记录?
  • String#split 不会更容易吗?您可以获取每个用户代理的数组并解析剩余的文本。
  • 请原谅我的油嘴滑舌,但“two problems” quote 似乎与此相关。无需正则表达式即可轻松完成此解析。
  • 为什么是正则表达式?您可以以不同的方式为此使用正则表达式,但您需要其中的几个。你也忽略了Allow:

标签: java regex web-crawler robots.txt


【解决方案1】:

如果我正确理解了您的问题,您希望获取用户代理名称及其禁止列表。

为此,我可以想出一个像这样的简单正则表达式:

User-agent: (.*)|Disallow: (.*)

Working demo

我们的想法是在第 1 组中捕获代理名称,在第 2 组中捕获禁止列表。这里有比赛信息

Match 1        Group 1. 12-13   `*`
Match 2            Group 2. 24-26   `/a`
Match 3            Group 2. 37-41   `/b/c`
Match 4            Group 2. 52-58   `/d/c/h`
Match 5        Group 1. 72-78   `agent1`
Match 6            Group 2. 89-95   `/a1/c1`
Match 7            Group 2. 106-112 `/b1/d1`
Match 8        Group 1. 126-132 `agent2`
Match 9            Group 2. 143-149 `/a2/c2`
Match 10           Group 2. 160-166 `/b2/d2`

【讨论】:

  • 它以某种方式工作,谢谢。这不是很好,因为每个用户代理的“禁止”列表应该是一次性匹配的。没关系
  • @DragosRoban,正则表达式是模式匹配的正确工具,但你想要的是有一个具有逻辑的正则表达式,这不是正确的工具。如果您需要执行逻辑,则必须使用其他工具或帮助您的模式匹配正则表达式并使用代码对内容进行分组。还要记住,我给你的正则表达式非常易读和简单,如果你想要一个有逻辑的正则表达式,那将是一个几乎无法理解的可怕模式,或者至少在我的脑海中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2022-01-25
  • 2016-03-31
  • 2012-01-25
相关资源
最近更新 更多