C++ std::regex Expressions Régulières Trouver des correspondances multiples
Je suis en train d'analyser un certificat en c++ et a décidé que c'était une bonne occasion d'apprendre les Regex. Je viens d'apprendre sur les regex une heure ou deux il ya, donc excusez mon manque de connaissance.
Je suis à la recherche pour l'ensemble de l'unité d'organisation est associée à une entrée.
Je suis en train de faire les suivants:
std::smatch OuMatches;
std::string myCertSubject = "O=\"My Company, Incorporated\", OU=Technician Level - A3, OU=Access Level - 1, CN=\"Name, My\", [email protected]";
std::regex subjectRx("OU=[[:w:]|[:s:]|[:digit:]|-]*", std::regex_constants::icase);
bool foundOU = std::regex_search(mySubject,OuMatches,subjectRx);
Pourquoi ne pas me donner tous les résultats (2) qui correspondent à mon reg ex? Est-il un moyen de l'obtenir?
Vous devriez poster positives et négatives des matchs.
autant que je sache, std::regex n'est pas implémentée dans la bibliothèque libstdc++ encore. Utiliser boost::regex
J'attends que les deux OU=... exemples dans ma chaîne ci-dessus correspondent, mais seulement jusqu'à la prochaine OU, CN, etc. Quelque chose comme le CN entrée ci-dessus ne correspondent PAS, et maintenant que je pense à ce sujet, ni de tout OU contenant d'autres signes de ponctuation. Comme je l'ai dit je suis nouveau sur le regex, mais ce que je veux faire est d'obtenir tous les de la OU des champs, pas y compris l'entrée suivante (OU= CN=, E=, etc.)
double possible de Comment faire pour correspondre à de multiples résultats en utilisant std::regex
autant que je sache, std::regex n'est pas implémentée dans la bibliothèque libstdc++ encore. Utiliser boost::regex
J'attends que les deux OU=... exemples dans ma chaîne ci-dessus correspondent, mais seulement jusqu'à la prochaine OU, CN, etc. Quelque chose comme le CN entrée ci-dessus ne correspondent PAS, et maintenant que je pense à ce sujet, ni de tout OU contenant d'autres signes de ponctuation. Comme je l'ai dit je suis nouveau sur le regex, mais ce que je veux faire est d'obtenir tous les de la OU des champs, pas y compris l'entrée suivante (OU= CN=, E=, etc.)
double possible de Comment faire pour correspondre à de multiples résultats en utilisant std::regex
OriginalL'auteur Kyle Preiksa | 2013-09-13
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser un démenti de la classe de caractères à la place. J'ai l'impression de vos classes de personnages ne sont pas de se comporter comme vous pensez qu'ils sont...
[^,]*
correspond à tous les caractères, à l'exception d'une virgule.Comme pour les matches, essayez d'utiliser une boucle:
Je ne connais pas beaucoup le C++, mais j'ai trouvé cette page de documentation qui, je pense, devrait être un peu plus utile.
Le morceau de code qu'il a ici,
EDIT: je viens de réaliser que vous pouvez avoir des virgules dans les paramètres comme dans
O=
, qui ne sera pas travailler avec[^,]
. Au lieu de cela, vous pouvez utiliser cette regex:Vous pouvez voir un exemple avec
O=
ici.Mise à jour de ma réponse. Désolé si je ne suis pas familier avec le C++ ^^;
duh! J'ai été absent de la s=m.suffixe().str(); partie... Qui fait sens aujourd'hui. Vous devez indiquer que vous avez déjà trouvé le premier match d'une certaine manière, et il est fait en prenant la partie après votre recherche et en utilisant ce que votre nouvelle chaîne de caractères à rechercher. Je vous remercie beaucoup. c'est beaucoup pour envelopper votre tête autour de en un jour 😉
Je ne peux pas dire qu'il fait beaucoup de sens pour moi, mais je comprends la logique, ouf! Vous êtes les bienvenus! J'ai été heureux d'aider ^^
Merci beaucoup pour la réponse informative. J'ai beaucoup appris grâce à cette expérience.
OriginalL'auteur Jerry
Il semble que vous êtes juste essayer d'obtenir une chaîne de caractères qui ressemble à
OU=XXXXXXXXXXXXXXXXX
suivi par une virgule ou un point-virgule.Cette regex qui fera:
Ce que cela signifie, c'est la chaîne
OU=
, suivie par au moins un caractère qui n'est pas une virgule ou un point-virgule:Voici un exemple de code utilisant cette regex pour imprimer les allumettes (basé sur l'exemple ici):
Ce site web ne pense pas que votre regex fonctionne: debuggex.com/r/g02uW9S4tvj5La15/0 Sont-ils mis en œuvre différemment en C++?
Excellente ressource, je vous remercie. Elle au moins un peu travaillé parce que j'ai eu un résultat exactement comme je m'y attendais, le problème est d'obtenir les autres. J'ai changé ma Regex pour ce que vous avez (en fait, sans le
(?=(,|;))
) et il n'est toujours pas me donner les deux matches.Aussi, @Tharwen, est-il un moyen de dire quelque chose comme "un caractère qui n'est pas" pour une séquence? Donc, en d'autres mots ce que je peux dire, donnez-moi le tout jusqu'à ce qu'un "OU=" s'affiche.
.*(?=(OU=))
devrait vous donner tout avant une UO'='.OriginalL'auteur Tharwen