2017-03-07 100 views
2

我想找到一个合适的正则表达式来解析robots.txt文件。Java正则表达式解析/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 

所以我试图做的是建立一个正则表达式,以便对每个用户代理名称(*,agent1,agent2)及其Disallow列表。

这里是代码我试过,但我没有得到我的期望:

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: 
---------------------- 

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

+0

难道不是更容易:拆分换行 - 检查第一行以'User-agent:'开始并提取它 - 而行以'Disallow'开头添加它们到你的记录 - 当满足空行时,开始新的记录? –

+0

不会String#分裂会更容易吗?您可以获取每个用户代理的数组并解析剩余的文本。 –

+0

原谅我的贪婪,但[“两个问题”引用](http://regex.info/blog/2006-09-15/247)在这里似乎相关。这种分析很容易完成,没有正则表达式。 – VGR

回答

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` 
+0

它以某种方式工作,谢谢。这并不好,因为每个用户代理的'Dissallow'列表应该一次匹配。没关系 –

+0

@DragosRoban,正则表达式是模式匹配的正确工具,但是你想要的是具有逻辑的正则表达式,而逻辑并不是这种工具的正确工具。如果您需要执行逻辑,则必须使用其他工具或使用正则表达式帮助您的模式进行匹配,并使用代码对内容进行分组。另外请记住,我给你的正则表达式非常可读和简单,如果你想要一个带有逻辑的正则表达式,它将是一个几乎不可能理解的可怕模式,或者至少在我头脑中 –