J'essaie de trouver un moyen de supprimer tout texte dans une chaîne avant de faire correspondre dans Regex. Je codifie cela en C #. p>
Par exemple, si la chaîne est "Hello, le test de test", et que le motif est "Test", j'aimerais que le résultat final soit "correspondant" (c.-à-d. Retirer tout avant le test). P>
Toute pensée? Merci! P>
Edit: J'aurais probablement dû être un peu plus spécifique dans mon exemple après avoir lu vos réponses (et merci pour eux). J'aime la méthode Lookahead, mais j'ai simplifié mon exemple. Pour rendre les choses plus difficiles, les cordes ressemblent généralement à: p>
"Bonjour, test de test de test Tabler" p>
Donc, si j'utilise le modèle "Test", il attrapera le premier. Ce que mon objectif est, est de remplacer tout le texte après le deuxième match. C'est-à-dire: résultat dans "Test TowAfter" .... désolé pour ça. P>
3 Réponses :
pour une solution simple, il suffit de remplacer " début de ligne em> n'importe quoi i> test" avec "test": Si vous souhaitez éviter de faire dupliquer le mot de recherche, vous pouvez utiliser un Assertion lookahead positive zéro : p> * code> est gourmand, cela remplacera autant que possible, c'est-à-dire que un test B B code> deviendra test C code>. Pour remplacer le moins possible, utilisez *? Code> au lieu de * code>. P> newString = Regex.Replace(oldString, "^.*(?=test)", "");
Cela supprimera tout avant le dernier i> correspondance de test code>. Peu importe que ce soit dans de nombreux cas, mais cela peut aussi être déroutant.
En fait, comme je lisais les réponses maintenant, c'est exactement ce que je dois faire (voir mon édition ci-dessus). J'en ai besoin pour correspondre au dernier résultat et le remplacer tout avant. Merci beaucoup.
@keynesiancross: Si tel est le cas, vous devez accepter cette réponse ou celle de Heinzi, pas i> Paul's. Rien de personnel, Paul, mais celui-ci ne fonctionne que par accident.
À peine des œuvres d'accident que la question n'ait pas indiqué qu'il voulait seulement le dernier match. Ce n'est qu'après avoir répondu qu'il a commenté cela.
Vous pouvez utiliser lookahead positif pour faire correspondre une chaîne mais ne pas la capturer:
^.*?(?=test)
THX pour la réponse - a fait une édition sur le problème ci-dessus ... J'aime cette approche de la lunette cependant. Puis-je sélectionner la 2ème correspondance et ensuite regarder devant vous?
Comment voudriez-vous tout capturer après l'occurrence?
* Mise à jour, à l'aide de MatchCollection
string test = "hello, test matching"; string regexStrTest; regexStrTest = @"test\s\w+"; MatchCollection m1 = Regex.Matches(test, regexStrTest); //gets the second matched value string value = m1[1].Value;
C'est un lookbehind i>, pas une lunette de regard, et ça ne fait rien d'utile. Si "test \ s" code> vient de consommer test code> suivi d'un espace, puis bien sûr un lookbehind pour "test" code> va réussir. En outre, l'option singline code> n'a aucun effet car le . Code> métacaracter n'est pas utilisé dans la regex.
Eh bien, le code supplémentaire non fonctionnel est parti, mais cela renvoie toujours la survenue secondaire i> de test code> et un mot i> le suivant. Dans un commentaire à une autre réponse, l'OP a dit que c'était vraiment le dernier événement I> Dernier i> Il veut (vous devez mettre à jour la question à nouveau, @keynes), et le match doit inclure tout ce qui est après cela, pas seulement un mot.
Je ne suis pas assez familier avec C # pour écrire le code. Cependant, n'utilisez pas de regex, utilisez des méthodes de base de la chaîne. recherche i> pour trouver l'événement que d'utiliser Substring i> capture tout après i>.
Pour les modèles que vous essayez de supprimer, sont-ils toujours des cordes ou sont-ils parfois des expressions régulières réelles? Si le premier, utilisez
indexof code> etSubstring code> et évitez les pénalités de performance dont vous n'avez pas besoin.Dupliquer possible: Supprimer le texte de la chaîne jusqu'à ce qu'il atteigne un certain caractère