2017-03-07 1 views
2

J'essaie de trouver une regex correcte pour analyser un fichier robots.txt.Java regex pour analyser /robots.txt

Alors ce que je fais est de prendre la page dans une chaîne qui ressemble à celui-ci par exemple:

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 

Donc ce que je suis en train de faire est de créer un regex à prendre pour chaque utilisateur -agent le nom de l'agent (*, agent1, agent2) et sa liste Disallow.

Voici le code que je l'ai essayé, mais je ne reçois pas ce que je pense:

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("----------------------"); 
    } 

} 

Malheureusement, le résultat que je reçois est

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

Je reçois le nom de l'agent, mais pas la liste des interdictions.

+0

Ne serait-il plus facile à Split par saut de ligne - vérifier que la première ligne commence par 'User-agent:' et extraire - tandis que les lignes commencent par 'Disallow' les ajouter à votre dossier - quand une ligne vide est rencontrée, commencez un nouvel enregistrement? –

+0

Est-ce que le split # String ne serait pas plus facile? Vous pouvez obtenir un tableau de chaque agent utilisateur et analyser le texte restant. –

+0

Pardonnez mon glibness, mais la ["deux problèmes" citation] (http://regex.info/blog/2006-09-15/247) semble pertinente ici. Cette analyse est facilement effectuée sans expressions régulières. – VGR

Répondre

1

Si j'ai bien compris votre question, vous voulez capturer le nom de l'agent utilisateur et sa liste d'interdiction.

Pour ce faire, je peux venir avec un simple regex comme ceci:

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

Working demo

L'idée est de capturer dans le groupe 1 le nom de l'agent et dans le groupe 2 de la liste disallow . Ici vous avez les informations match

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

Ça marche en quelque sorte, merci. Ce n'est pas correct parce que la liste 'Dissallow' pour chaque user-agent doit correspondre à une seule fois. C'est bon –

+0

@DragosRoban, regex est le bon outil pour la correspondance de pattern, mais ce que vous voulez, c'est avoir une regex avec une logique qui n'est pas l'outil parfait pour cela. Si vous avez besoin de faire de la logique, vous devez utiliser un autre outil ou aider votre motif à correspondre avec regex et utiliser le code pour grouper le contenu. Gardez aussi à l'esprit que l'expression rationnelle que je vous ai donnée est assez lisible et simple, si vous voulez avoir une regex avec de la logique, ce sera un modèle horrible presque impossible à comprendre, ou du moins en tête –