J'ai du mal à trouver une bonne ressource qui explique comment utiliser les groupes de capture nommés en C #. Voici le code que j'ai jusqu'à présent:
string page = Encoding.ASCII.GetString(bytePage);
Regex qariRegex = new Regex("<td><a href=\"(?<link>.*?)\">(?<name>.*?)</a></td>");
MatchCollection mc = qariRegex.Matches(page);
CaptureCollection cc = mc[0].Captures;
MessageBox.Show(cc[0].ToString());
Cependant, cela montre toujours juste la ligne complète:
<td><a href="/path/to/file">Name of File</a></td>
J'ai expérimenté plusieurs autres "méthodes" que j'ai trouvées sur divers sites Web mais j'obtiens toujours le même résultat.
Comment puis-je accéder aux groupes de capture nommés qui sont spécifiés dans mon expression régulière?
<>
cassera. Vous pouvez utiliser à la(?'link'.*)
place dans ce cas. Pas tout à fait pertinent pour cette question, mais j'ai atterri ici à partir d'une recherche Google sur les "groupes de capture nommés .net", donc je suis sûr que d'autres personnes le sont aussi ...<>
cela ne le cassera pas. J'ai pu utiliser lamyRegex.GetGroupNames()
collection comme noms d'élément XML.Réponses:
Utilisez la collection de groupes de l'objet Match, en l'indexant avec le nom du groupe de capture, par exemple
la source
var m
, car ce serait unobject
.Vous spécifiez la chaîne de groupe de capture nommée en la transmettant à l'indexeur de la
Groups
propriété d'unMatch
objet résultant .Voici un petit exemple:
la source
L'exemple de code suivant correspondra au modèle même en cas d'espace entre les caractères. c'est à dire :
aussi bien que:
La méthode renvoie true ou false, selon que la chaîne htmlTd d'entrée correspond au modèle ou non. S'il correspond, les paramètres de sortie contiennent respectivement le lien et le nom.
J'ai testé cela et cela fonctionne correctement.
la source
${1}
tenir à garder les choses encore plus simples.De plus, si quelqu'un a un cas d'utilisation où il a besoin de noms de groupe avant d'exécuter la recherche sur un objet Regex, il peut utiliser:
la source
Cette réponse améliore la réponse de Rashmi Pandit , qui est en quelque sorte meilleure que les autres car elle semble résoudre complètement le problème exact détaillé dans la question.
La mauvaise partie est qu'elle est inefficace et n'utilise pas systématiquement l'option IgnoreCase.
La partie inefficace est parce que l'expression régulière peut être coûteuse à construire et à exécuter, et dans cette réponse, elle aurait pu être construite une seule fois (l'appel ne
Regex.IsMatch
faisait que reconstruire l'expression régulière derrière la scène). EtMatch
méthode aurait pu être appelé une seule fois et stocké dans une variable puislink
etname
doit appelerResult
de cette variable.Et l'option IgnoreCase n'était utilisée que dans la
Match
pièce mais pas dans laRegex.IsMatch
pièce.J'ai également déplacé la définition Regex en dehors de la méthode afin de la construire une seule fois (je pense que c'est l'approche raisonnable si nous stockons cet assemblage avec l'
RegexOptions.Compiled
option).la source