Par exemple, renvoyez la partie de la chaîne qui se trouve après la dernière x
dans axxxghdfx445
(doit renvoyer 445
).Comment puis-je faire correspondre tout ce qui est après la dernière occurrence de certains char dans une expression régulière perl?
Répondre
my($substr) = $string =~ /.*x(.*)/;
De perldoc perlre:
Par défaut, un sous-motif quantifié est « gourmand », qui est, il correspondra autant de fois que possible (donné un emplacement de départ particulier) tout en encore permettant au reste du motif de correspondre.
Voilà pourquoi .*x
correspondra à la dernière apparition de x
.
La façon la plus simple serait d'utiliser /([^x]*)$/
la première réponse est bonne, mais quand on parle de « quelque chose qui ne contient pas » ... j'aime utiliser l'expression rationnelle qui « correspond » il
my($substr) = $string =~ /.*x([^x]*)$/;
très utile dans certains cas
Regular expression: /([^x]+)$/
#assuming x is not last element of the string.
Le moyen le plus simple n'est pas une expression régulière, mais un simple split() et l'obtention du dernier élément.
$string="axxxghdfx445";
@s = split /x/ , $string;
print $s[-1];
Est-ce vraiment la peine de créer un tableau temporaire? 'print (split/x /, $ string) [- 1];' fonctionnerait aussi bien. – Zaid
Ça dépend? Et si je veux utiliser les autres éléments? – ghostdog74
Encore une autre façon de le faire. Ce n'est pas aussi simple qu'une seule expression régulière, mais si vous optimisez pour la vitesse, cette approche sera probablement plus rapide que toute autre utilisation de regex, y compris split
.
my $s = 'axxxghdfx445';
my $p = rindex $s, 'x';
my $match = $p < 0 ? undef : substr($s, $p + 1);
Je suis surpris que personne n'a mentionné la variable spéciale qui fait cela, $'
: « $'
» renvoie tout après la chaîne en correspondance. (perldoc perlre)
my $str = 'axxxghdfx445';
$str =~ /x/;
# $' contains '445';
print $';
Cependant, il y a un coût (de Souligné par l'auteur):
AVERTISSEMENT: Une fois que Perl voit que vous avez besoin d'un de & $, "
", or "$'" anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program. Perl uses the same mechanism to produce $1, $2, etc, so you also pay a price for each pattern that contains capturing parentheses. (To avoid this cost while retaining the grouping behaviour, use the extended regular expression "(?: ...)" instead.) But if you never use $&, "$
$" ou «$», alors les modèles sans parenthèses de capture ne seront pas pénalisés. Donc, évitez $ &, "$ '", et "$` "si vous le pouvez, mais si vous ne pouvez pas (et certains algorithmes vraiment les apprécier), une fois que vous les avez utilisés une fois, utilisez-les à volonté, parce que vous avez déjà payé le prix. À partir de 5.005, $ & n'est pas si coûteux que le deux autres.
Mais attendez, il y a plus! Vous obtenez deux opérateurs pour le prix d'un, agissez MAINTENANT!
En tant que solution de contournement pour ce problème, Perl 5.10.0 introduit "$ {^} PREMATCH", "$ {^} MATCH" et "$ {^} POSTMATCH", qui sont équivalents à « $ "", $ & et "$", sauf qu'ils ne sont garantis que définis après une correspondance réussie qui a été exécutée avec le modificateur "/ p" (preserve). L'utilisation de ces variables n'entraîne pas de pénalité de performance globale, contrairement à leurs équivalents char de ponctuation, cependant au compromis que vous devez dire à perl quand vous voulez les utiliser.
my $str = 'axxxghdfx445';
$str =~ /x/p;
# ${^POSTMATCH} contains '445';
print ${^POSTMATCH};
Je soumettre humblement que cette voie est la meilleure approche et plus directe vers l'avant dans la plupart des cas, car il ne nécessite pas que vous faites des choses avec la construction de votre modèle spécial afin de récupérer les partie post-match, et il est pas de pénalité de performance.
Sauf que vous attrapez la première occurrence de 'x', pas la dernière. – runrig
@runrig: lol, façon de faire dérailler toute ma thèse :) En effet, dans ce cas particulier, '/ x ([^ x] *) $ /' serait mieux ... Je me suis trop rattrapé pour décrire '$ ' ', que tout le monde avait oublié. – Ether
Si vous mettez un '\' devant le caractère '' 'vous pouvez éviter le style de code au milieu de votre citation. – CyberSkull
- 1. Comment faire correspondre tout jusqu'à la deuxième occurrence d'un personnage?
- 2. Expression régulière, faire correspondre les caractères entre {}
- 3. Regex pour correspondre à la dernière occurrence
- 4. Expression régulière récursive, comment faire correspondre la chaîne couplée avec une expression régulière?
- 5. Quelle est la meilleure façon de faire correspondre les ID avec une expression régulière dans Hpricot?
- 6. Comment faire correspondre et capturer une expression régulière en C#
- 7. Comment rendre une expression régulière Perl facultative?
- 8. Comment faire correspondre les caractères cyrilliques avec une expression régulière
- 9. Comment utiliser une expression régulière pour faire correspondre un nom?
- 10. Besoin d'imprimer la dernière occurrence d'une chaîne en Perl
- 11. Comment puis-je faire correspondre tout avec une expression régulière PHP?
- 12. expression régulière pour faire correspondre une liste de chaînes
- 13. C# Expression régulière, Faire correspondre le contenu de la chaîne
- 14. Expression régulière pour recueillir tout après le dernier/
- 15. PHP Expression régulière, comment faire correspondre la première section qui comprend un [symbole?
- 16. Expression régulière correspondant à tout sauf une expression régulière donnée
- 17. Comment faire correspondre les noms de paramètres dans une expression?
- 18. Comment fonctionne cette expression régulière?
- 19. Comment utiliser une variable Perl dans une expression régulière?
- 20. Comment commentez-vous une expression régulière Perl?
- 21. Regexp: comment faire correspondre tout ce qui n'est pas dans un motif?
- 22. Expression régulière pour faire correspondre un numéro de téléphone
- 23. problème expression régulière Perl
- 24. Comment faire correspondre un texte qui peut contenir - ou un trait de soulignement en utilisant une expression régulière?
- 25. expression régulière pour correspondre à un modèle
- 26. Comment rendre une expression Perl d'expression régulière facultative?
- 27. Expression régulière - Obtenir Tout sauf Dernier match
- 28. Comment puis-je convertir une chaîne en une expression régulière qui lui correspond dans Perl?
- 29. Correspondance exacte d'une occurrence dans une chaîne avec une expression régulière
- 30. Expression régulière pour correspondre à une chaîne uniquement lorsque certains caractères n'existent pas
+1 en effet très utile –
Vous n'avez pas besoin de l'en-tête '. * X' dans la regex. – runrig
c'est vrai, merci, mais c'était pour illustrer le "quelque chose qui ne contient pas x" – benzebuth