Question

J'ai une liste d'objets en sortie de ldapsearch comme suit:

dn: cn=HPOTTER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=HGRANGER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=RWEASLEY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=DMALFOY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=SSNAPE,ou=FACULTY,ou=HOGWARTS,o=SCHOOL
dn: cn=ADUMBLED,ou=FACULTY,ou=HOGWARTS,o=SCHOOL

Jusqu'à présent, j'ai l'expression régulière suivante:

/\bcn=\w*,/g

Qui renvoie des résultats comme ceci:

cn=HPOTTER,
cn=HGRANGER,
cn=RWEASLEY,
cn=DMALFOY,
cn=SSNAPE,
cn=ADUMBLED,

J'ai besoin d'une expression rationnelle qui renvoie des résultats tels que:

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

Que dois-je changer dans mon regex pour que le modèle (le cn= et la virgule) ne soit pas inclus dans les résultats?

EDIT: , je vais utiliser sed pour faire la correspondance de modèle et rediriger la sortie vers d'autres utilitaires de ligne de commande.

Était-ce utile?

La solution

Cela ressemble plus à un problème d’analyse syntaxique simple qu’à un regex. Une grammaire ANTLR réglerait cela en un rien de temps.

Autres conseils

Vous devrez effectuer un regroupement. Ceci est fait en modifiant l'expression régulière comme suit:

/\bcn=\(\w*\),/g

Ceci va ensuite renseigner votre résultat dans une variable de regroupement. Selon votre langue, la façon d'extraire cette valeur sera différente. (Pour vous avec sed la variable sera \ 1)

Notez que la plupart des saveurs de regex ne doivent pas échapper aux crochets (), mais puisque vous utilisez sed , vous devrez le faire comme indiqué ci-dessus.

Pour une excellente ressource sur les expressions régulières, je suggère: Maîtriser les expressions régulières

OK, l'endroit où vous avez posé la question plus spécifique a été fermé en tant que & "Copie exacte &"; de cela, alors je copie ma réponse de là à ici:

Si vous souhaitez utiliser sed, vous pouvez utiliser un des éléments suivants:

sed -e 's/dn: cn=\([^,]*\),.*$/\1/'

Vous devez utiliser [^,]* car dans sed, .* est & "gourmand &"; ce qui signifie qu'il va correspondre à tout ce qu'il peut avant de regarder le caractère suivant. Cela signifie que si vous utilisez \(.*\), dans votre modèle, il correspondra à la dernière virgule, pas à la première virgule.

Découvrez Expresso , je l'avais déjà utilisé pour créer mon RegEx. C’est bien d’aider à l’apprentissage aussi.

La méthode rapide et sale consiste à utiliser des sous-correspondances en supposant que votre moteur le supporte:

/\bcn=(\w*),/g

Ensuite, vous voudriez obtenir le premier sous-match.

Sans savoir quelle langue vous utilisez, nous ne pouvons le dire avec certitude, mais dans la plupart des analyseurs syntaxiques d’expressions régulières, utilisez des parenthèses, telles que

.

/ \ bcn = (\ w *), / g

alors vous pourrez obtenir le premier motif correspondant (souvent \ 1) exactement comme vous le cherchez. Pour être plus précis, nous devons savoir quelle langue vous utilisez.

Si votre expression rationnelle prend en charge Lookaheads et Lookbehinds, vous pouvez utiliser

/(?<=\bcn=)\w*(?=,)/g

Cela correspondra

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

Mais pas le cn= ni le , de chaque côté. La virgule et <=> doivent encore être présents pour le match, ils ne sont tout simplement pas inclus dans le résultat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top