2017-03-07 48 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,正則表達式是模式匹配的正確工具,但是你想要的是具有邏輯的正則表達式,而邏輯並不是這種工具的正確工具。如果您需要執行邏輯,則必須使用其他工具或使用正則表達式幫助您的模式進行匹配,並使用代碼對內容進行分組。另外請記住,我給你的正則表達式非常可讀和簡單,如果你想要一個帶有邏輯的正則表達式,它將是一個幾乎不可能理解的可怕模式,或者至少在我頭腦中 –