Ad esempio, restituire la parte della stringa che si trova dopo l'ultimo x
in axxxghdfx445
(deve restituire 445
).Come posso abbinare tutto ciò che è dopo l'ultima occorrenza di un carattere in un'espressione regolare perl?
risposta
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
.
Il modo più semplice sarebbe quella di utilizzare /([^x]*)$/
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
Regular Expression: /([^x]+)$/
#assuming x is not last element of the string.
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];
Vale veramente la pena creare un array temporaneo? 'print (split/x /, $ string) [- 1];' funzionerebbe altrettanto bene. – Zaid
Dipende proprio? Cosa succede se voglio usare gli altri elementi? – ghostdog74
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);
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.
Tranne che stai prendendo la prima occorrenza di "x", non l'ultima. – runrig
@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
Se metti un '\' prima del carattere ''' puoi evitare lo stile del codice nel mezzo della tua citazione. – CyberSkull
- 1. espressione regolare per abbinare tutto fino all'ultima occorrenza di/
- 2. Come abbinare tutto dopo @ fino allo spazio?
- 3. trova tutto ciò che è nullo nell'associazione
- 4. Come posso abbinare le stringhe che non corrispondono ad un particolare modello in Perl?
- 5. Regex come abbinare un carattere opzionale
- 6. Come tagliare tutto dopo un certo carattere in sql
- 7. Convertire tutto ciò che non è un numero a vuoto
- 8. Rimuovi stringa dopo l'ultima occorrenza di un carattere
- 9. Espressione regolare con i caratteri jolly per abbinare qualsiasi carattere
- 10. regex per abbinare un singolo carattere che è tutto tranne uno spazio
- 11. rimuovere tutto ciò dopo l'ultima barra rovesciata
- 12. Taglia la stringa dopo la prima occorrenza di un carattere
- 13. Regex rimuovere tutto ciò che segue: (compreso :)
- 14. SQL SELEZIONA tutto dopo un determinato carattere
- 15. Come cancellare tutto dopo un determinato carattere in una stringa?
- 16. PHP rimuovere caratteri dopo l'ultimo occorrenza di un carattere in una stringa
- 17. Riavvio di tutto ciò che è necessario dopo le modifiche a freetds.conf?
- 18. Qual è il vero significato di "Tutto ciò che esiste è un oggetto" in R?
- 19. Come posso abbinare i caratteri coreani in un'espressione regolare Ruby?
- 20. Rimozione tutto dopo il carattere (e anche carattere)
- 21. Come posso consentire un punto letterale in un'espressione regolare Perl?
- 22. JNativeHook come si evita di stampare tutto ciò che accade?
- 23. Rimozione spazi e tutto ciò che non è alfanumerico
- 24. Regex - come abbinare tutto tranne un particolare motivo
- 25. come rimuovere tutto il testo dopo l'ultima ricorrenza di un certo carattere
- 26. Regex per abbinare 1 o meno occorrenza di stringa?
- 27. ciò che è :: * in C++
- 28. Espressione regolare PHP per abbinare linee che iniziano con un carattere speciale
- 29. Rimuovere elegantemente la parte di una stringa dopo l'ultima occorrenza di un carattere
- 30. Devo usare \ d o [0-9] per abbinare le cifre in un'espressione regolare Perl?
+1 davvero molto utile –
Non è necessario il leader '. * X' nella regex. – runrig
giusto, grazie, ma quello era per illustrare "qualcosa che le doeas non contengono x" – benzebuth