Je voulais savoir comment obtenir la prochaine correspondance d'un MatchCollection après un Capture.Index spécifique avec Linq?
Disons que j'ai un MatchCollection "myMatches" et que je connais un Capture.Index spécifique d'une correspondance dans il. Je veux obtenir la prochaine correspondance, sa valeur, dans "mesMatchs" maintenant mais je ne comprends pas comment écrire la requête Linq ...
string myNextMatch = myMatches.OfType<Match>().Select(m => m.NextMatch().Value).Where( ??? ).ToString();
J'ai déconné avec quelque chose comme ça mais rien ne fonctionne. Y a-t-il quelqu'un ici qui puisse vous aider? Merci!
3 Réponses :
Il n'est pas nécessaire d'utiliser Linq , vous pouvez accéder à une correspondance spécifique par index - ou si cela doit être Linq , vous pouvez utiliser Last () pour déterminer le dernier élément: string input = "ababab";
Regex regx = new Regex("a", RegexOptions.IgnoreCase);
MatchCollection myMatches = regx.Matches(input);
Match lastMatch = myMatches[myMatches.Count - 1];
string result = input.Substring(lastMatch.Index, lastMatch.Length); // ababab
// ^
Mais ce n'est pas l'index de la collection que je connais, c'est le capture.index d'une correspondance dans la collection. C'est donc l'index de la position dans la chaîne d'origine.
Ok, on dirait que nous avons un problème de problème xy ici - qu'est-ce que vous essayez réellement d'accomplir - pourriez-vous ajouter un exemple avec entrée / sortie attendue à la question
OK, utilisons votre exemple là-haut. La collection contient 3 correspondances (chacune 'a'). La correspondance avec l'index 1 dans la collection a le capture.index 2 (match.index). Je voulais maintenant obtenir la prochaine correspondance de la collection en utilisant ce capture.index pour la trouver. J'espère que c'est compréhensible.
@burnie juste pour être sûr - quel est le résultat attendu?
Dans l'exemple ci-dessus, la sortie attendue doit être le dernier (troisième) «a». Dans le cas où le capture.index serait 2;)
Alors toujours le dernier match? quelque chose comme string myNextMatch = myMatches.OfType
J'ai pensé qu'il devrait être possible d'obtenir la prochaine correspondance dans la collection uniquement en utilisant un match.index pour la trouver. Chaque correspondance dans la collection stocke l'index de la chaîne d'origine où le modèle a été trouvé. Donc, mon idée est d'obtenir la correspondance du match.index que je connais et d'utiliser NextMatch () (peut-être?) Pour trouver la correspondance suivante dans la collection. Oh, cela semble assez compliqué, désolé, je ne sais pas comment l'expliquer mieux.
L'index ne vous indique pas la durée de la correspondance. par exemple. [a-z] + peut être de n'importe quelle longueur.
La longueur est-elle importante pour trouver le prochain match de la collection? Je pensais que vous pouviez faire quelque chose comme chercher une correspondance avec match.index que je connais, puis me renvoyer le prochain match de la collection. Ce n'est pas possible de cette façon?
Ok disons ici que vous avez le dernier index int lastIndex = myMatches.OfType et vous voulez obtenir le résultat de votre chaîne initiale "ababab" Comment? "ababab" .Substring (lastIndex ,?);
Ah tu veux dire parce que ça pourrait être hors de portée. Ce n'est pas un problème dans mon cas, il y a toujours au moins une correspondance de plus dans la collection du match.index que je connais. Mais peut-être que votre exemple tout à l'heure aide à le comprendre.
Je l'ai maintenant. J'ai déconné et c'est ce que je veux (presque) ...
string myString = ">first match< >second match< >third match< >fourth match<";
MatchCollection myMatches = new Regex(">([^<])+<").Matches(myString);
// let's say this is the index I know, should be 29
int myKnownIndex = myMatches[2].Index;
// myNextMatch result will be ">fourth match<"
string[] myNextMatch = myMatches.OfType<Match>()
.Where(m => m.Index == myKnownIndex)
.Select(m => m.NextMatch().Value).ToArray();
Mais maintenant ma question suivante, est-il possible de mettre la sortie directement dans une seule chaîne et de ne pas utiliser de tableau? Cela ne fonctionne que de cette façon pour le moment.
Essayez-le comme ceci:
string myNextMatch = myMatches.OfType<Match>().Single(m => m.Index == myKnownIndex).NextMatch().Value;
Mais soyez prudent. Si Single () ne trouve aucun objet ou plus, il lèvera une exception.
p >
Impressionnant! C'est exactement ce que je veux. Merci @Machine
Le
La méthode Match.NextMatchcalcule la correspondance suivante. Dans votre cas, vous avez déjà calculé toutes les correspondances, et les calculer une fois de plus semble être un gaspillage de ressources.