2010-08-09 3 views

Répondre

16
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.

7

La façon la plus simple serait d'utiliser /([^x]*)$/

5

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

+0

+1 en effet très utile –

+1

Vous n'avez pas besoin de l'en-tête '. * X' dans la regex. – runrig

+0

c'est vrai, merci, mais c'était pour illustrer le "quelque chose qui ne contient pas x" – benzebuth

1

Regular expression: /([^x]+)$/#assuming x is not last element of the string.

2

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]; 
+0

Est-ce vraiment la peine de créer un tableau temporaire? 'print (split/x /, $ string) [- 1];' fonctionnerait aussi bien. – Zaid

+0

Ça dépend? Et si je veux utiliser les autres éléments? – ghostdog74

3

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); 
3

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.

+1

Sauf que vous attrapez la première occurrence de 'x', pas la dernière. – runrig

+0

@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

+0

Si vous mettez un '\' devant le caractère '' 'vous pouvez éviter le style de code au milieu de votre citation. – CyberSkull

Questions connexes