3 votes

Faire correspondre la regex après la fin de la ligne

J'essaie de créer une expression rationnelle pour m'aider à analyser de nombreux fichiers robots.txt. Je cherche à savoir si des agents utilisateurs spécifiques ont été interdits.

Les fichiers ressemblent à peu près aux siens mais peuvent varier un peu avec l'espace blanc :

User-agent: *
Disallow: /next/

User-agent: *
Disallow: /mshots/v1/

# har har
User-agent: *
Disallow: /activate/

User-agent: *
Disallow: /wp-login.php

User-agent: *
Disallow: /signup/

User-agent: *
Disallow: /related-tags.php

Jusqu'à présent, j'ai trouvé cette regex :

user-agent.*:(.*$)

Avec les options définies pour le multiligne et la casse.

Cela fonctionne très bien pour la partie user-agent de mon exigence, mais maintenant je dois faire correspondre tout dissallow un mot qui vient avant un autre user-agent est déclaré. J'ai essayé de faire correspondre $ y \r\n mais je n'arrive pas à trouver comment continuer le match après que le $ . Tout motif que j'ajoute ensuite ne semble pas fonctionner. Par exemple :

user-agent.*:(.*$)(^.*disallow)

J'essaie de faire correspondre le saut de ligne et de l'interdire, mais cela ne correspond pas. De plus, je ne suis pas sûr de savoir comment terminer la correspondance avant l'élément user-agent et travailler encore sur la règle de la dernière déclaard.

Quelqu'un peut-il m'indiquer la bonne direction ?

2voto

Wiktor Stribiżew Points 100073

Vous pouvez utiliser

(?i)user-agent.*:(.*)([\r\n]\s*.*disallow)

Voir le Démonstration de regex . Vous n'avez pas besoin d'un RegexOptions.Multiline ici, car il n'est pas nécessaire d'utiliser l'option ^ ni $ qui auraient besoin de redéfinir leur comportement de.

Détails

  • (?i) - modificateur insensible à la casse
  • user-agent - une sous-chaîne littérale
  • .* - tous les caractères 0+ autres qu'un saut de ligne, autant que possible
  • : - un colon
  • (.*) - Groupe 1 : tous les caractères 0+ autres qu'un saut de ligne jusqu'à la fin de la ligne.
  • ([\r\n]\s*.*disallow) - Groupe 2 :
    • [\r\n]\s* - un caractère de saut de ligne (CR ou LF) et ensuite 0+ espaces blancs
    • .* - tous les caractères 0+ autres qu'un saut de ligne, autant que possible
    • disallow - une sous-chaîne

2voto

Tiago Sousa Points 743

Votre problème semble être que vous ne faites pas correspondre le saut de ligne entre le User-agent: * y Disallow .

Une regex comme celle-ci devrait fonctionner : /^user-agent: (.*)$[\s]^disallow: (.*)$/igm

Cette regex capturera la valeur de User-agent et la valeur de Disallow et fonctionnera avec n'importe quel type de nouvelle ligne. Le site igm flags mean case- I nsensibles, G lobal et M ultiline

Vous pouvez le tester en utilisant regexr .

1voto

Don 01001100 Points 1008

Vous pouvez utiliser le SingleLine et l'expression régulière suivante :

    String pattern = @"user-agent[^\r\n]*: ([^\r\n]+)[\r\n]+disallow[^\r\n]*: ([^\r\n]+)[\r\n]+";

    foreach (Match match in Regex.Matches(robots, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline))
    {
        Console.Out.WriteLine("---------");
        Console.Out.WriteLine("Match: `" + match.ToString() + "`");
        foreach (Group grp in match.Groups)
        {
            Console.Out.WriteLine("    Group: ``" + grp.ToString() + "``");
        }               
    }

Décomposer le modèle :

Un littéral user-agent suivi d'un nombre quelconque de caractères non-CRLF, suivi d'un deux-points et d'un espace. user-agent[^\r\n]*:

Au moins un caractère non-CRLF en tant que groupe. ([^\r\n]+)

Au moins un caractère CRLF. [\r\n]+

Un littéral disallow suivi d'un nombre quelconque de caractères non-CRLF, suivi d'un deux-points et d'un espace. disallow[^\r\n]*:

Au moins les caractères non-CRLF en tant que groupe. ([^\r\n]+)

Au moins un caractère CRLF. [ \r\n ]+

El SingleLine signifie "traiter l'entrée comme une seule ligne".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X