2010-08-09 10 views

risposta

16
my($substr) = $string =~ /.*x(.*)/; 

Da perldoc perlre:

Per impostazione predefinita, un sotto-regola quantificato è "greedy", cioè, corrisponderà come numero di volte possibile (dato un particolare luogo di partenza), mentre ancora permettendo che il resto del modello corrisponda.

Ecco perché .*x corrisponderà fino all'ultimo verificarsi di x.

7

Il modo più semplice sarebbe quella di utilizzare /([^x]*)$/

5

la prima risposta è buona, ma quando si parla di "qualcosa che non contiene" ... mi piace usare l'espressione regolare che "partite" si

my($substr) = $string =~ /.*x([^x]*)$/;

molto utile in alcuni casi

+0

+1 davvero molto utile –

+1

Non è necessario il leader '. * X' nella regex. – runrig

+0

giusto, grazie, ma quello era per illustrare "qualcosa che le doeas non contengono x" – benzebuth

1

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

2

il modo più semplice non è un'espressione regolare, ma un semplice split() e ottenere l'ultimo elemento.

$string="axxxghdfx445"; 
@s = split /x/ , $string; 
print $s[-1]; 
+0

Vale veramente la pena creare un array temporaneo? 'print (split/x /, $ string) [- 1];' funzionerebbe altrettanto bene. – Zaid

+0

Dipende proprio? Cosa succede se voglio usare gli altri elementi? – ghostdog74

3

Ancora un altro modo per farlo. Non è semplice come una singola espressione regolare, ma se stai ottimizzando la velocità, questo approccio sarà probabilmente più veloce di qualsiasi altra cosa che usi la regex, incluso lo split.

my $s  = 'axxxghdfx445'; 
my $p  = rindex $s, 'x'; 
my $match = $p < 0 ? undef : substr($s, $p + 1); 
3

Mi sorprende che nessuno ha menzionato la variabile speciale che fa questo, $': "$'" restituisce tutto dopo la stringa corrispondente. (perldoc perlre)

my $str = 'axxxghdfx445'; 
$str =~ /x/; 

# $' contains '445'; 
print $'; 

Tuttavia, v'è un costo (sottolineatura mia):

ATTENZIONE: Una volta Perl vede che è necessario uno dei $ &, "$ ", 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 $&, "$" o "$ '", quindi i pattern senza che catturano le parentesi non saranno penalizzati. Quindi evita $ &, "$" "e " $ "" se puoi, ma se non puoi (e alcuni algoritmi in realtà sono apprezzarli), una volta che li hai usati una volta, usali a piacimento, perché hai già pagato il prezzo. A partire da 5,005, $ & non è così costoso come lo altri due.

Ma aspetta, c'è di più! Ottieni due operatori al prezzo di uno, agisci ORA!

Come una soluzione per questo problema, Perl 5.10.0 introduce "$ {^} Prematch", "$ {^} PARTITA" e "$ {^ POSTMATCH}", che sono equivalenti a "$ `", $ & e "$" ", tranne per il fatto che sono garantiti per essere definiti dopo una corrispondenza riuscita eseguita con il modificatore"/p " (preservare). L'uso di queste variabili non comporta alcuna penalizzazione globale delle prestazioni di , a differenza dei loro equivalenti di punteggiatura, tuttavia al trade-off che devi dire a perl quando vuoi usarli.

my $str = 'axxxghdfx445'; 
$str =~ /x/p; 

# ${^POSTMATCH} contains '445'; 
print ${^POSTMATCH}; 

vorrei umilmente sostengo che questo percorso è il migliore e più straight-forward approccio nella maggior parte dei casi, dal momento che non richiede che si fanno le cose speciali con la costruzione del modello, al fine di recuperare il porzione postmatch, e lì non c'è penalità di prestazioni.

+1

Tranne che stai prendendo la prima occorrenza di "x", non l'ultima. – runrig

+0

@runrig: lol, un modo per far deragliare tutta la mia tesi :) In effetti, in questo caso particolare, '/ x ([^ x] *) $ /' sarebbe meglio ... Sono troppo preso dal descrivere '$' ', che tutti gli altri avevano trascurato. – Ether

+0

Se metti un '\' prima del carattere ''' puoi evitare lo stile del codice nel mezzo della tua citazione. – CyberSkull

Problemi correlati