8
votes

Question Regex: Séquence de correspondance Seulement N fois sur un lieu aléatoire

J'ai une question de regex, prenez par exemple:

  1. ... AAA BZBZB CCCDDDD ...
  2. ... BZBZB DDD BZBZB CCC ...

    Je cherche une expression régulière qui correspond bzbzb juste n fois.
    dans une ligne. Donc, si je voulais correspondre à la séquence une seule fois, je ne devrais obtenir la première ligne que comme sortie.

    La chaîne se produit sur des endroits aléatoires dans le texte. Et la regex devrait être compatible avec Grep ou Egrep ...

    Merci d'avance.


0 commentaires

3 Réponses :


1
votes

de la page Man Grep:

>>>"ABZABZABX" |grep -e "BZ" -o | grep -e "BZ" -m 1
BZ


2 commentaires

Je suis désolé, je pense que je n'ai pas formulé la question correctement, ce que je veux dire correspondant à la séquence n fois dans une ligne.


n Times par ligne pour chaque ligne?



13
votes

grep '\ \ (. * bzbzb \) \ {5 \}' fera 5 fois, mais cela correspond à tout ce qui apparaît 5 fois ou plus parce que Grep vérifie si la sous-chaîne d'une ligne allumettes. Parce que Grep n'a aucun moyen de faire une correspondance négative des chaînes dans ses expressions régulières (uniquement des caractères), cela ne peut pas être effectué avec une seule commande à moins que, par exemple, vous saviez que les caractères utilisés dans la chaîne doivent être assortis. utilisé ailleurs.

Cependant, vous pouvez le faire dans deux commandes GREP:

chat temp.txt | grep '\ (. * bzbzb \) \ {5 \}' | grep -v '\ (. * bzbzb \) \ {6 \}'

retournera des lignes dans lesquelles bzbzb apparaît exactement 5 fois. (Fondamentalement, cela fait une vérification positive pendant 5 fois ou plus, puis une vérification négative pendant six fois ou plus.)


1 commentaires

Merci, vous m'avez aidé à comprendre que j'avais oublié d'échapper aux accolades bouclées.



1
votes

Son laide, mais si le GREP peut regarder des assertions à venir, cela devrait fonctionner:

/ ^ (((((((((((?) * bzbzb) {5} ((?! BZBZB).). * $ /

edit - le {5} ci-dessus est la variable Times dans l'OP. On dirait que Gnu Grep perle comme des assertions à l'aide de l'option -p.

échantillon Perl xxx

sortie xxx


2 commentaires

Egrep a prolongé des expressions régulières, mais je suis à peu près sûr que cela ne prend pas en charge les assertions à venir. Et si c'est le cas, ce n'est pas la bonne syntaxe. Ça traite! (ou plutôt, \! Depuis! Sur les lignes de commande est traité comme une référence d'événement même à l'intérieur de citations simples) comme le caractère littéral "!". Alors !? juste correspond à "!" ou "".


Vous avez besoin de Perl Style Re'S (> Version 5 Perl). Gnu grep serait grep -p '^ (((((((?! bzbzb).) * Bzbzb) {5} ((?! bzbzb).) * €' Il serait dommage de courir normal Grep à travers une double itération dans le même fichier. Cette regex fonctionne correctement, je peux poster un code à l'épreuve de Perl si vous avez besoin de le voir.