2013-11-04 11 views
23

Sto lavorando con un'API di Google che restituisce gli ID nel formato seguente, che ho salvato come stringa. Come posso scrivere un'espressione regolare in javascript per tagliare la stringa solo ai caratteri dopo l'ultima barra nell'URL.RegEx - Ottieni tutti i caratteri dopo l'ultima barra nell'URL

var id = 'http://www.google.com/m8/feeds/contacts/myemail%40gmail.com/base/nabb80191e23b7d9' 

risposta

9

Questo dovrebbe funzionare:

last = id.match(/\/([^/]*)$/)[1]; 
//=> nabb80191e23b7d9 
+1

Buona risposta. In Perl, i delimitatori regex devono essere sottoposti a escape, anche nelle classi di caratteri, altrimenti non troverà la regex da analizzare. – sln

61

Non scrivere un regex! Questo è banale a che fare con le funzioni di stringa invece:

var final = id.substr(id.lastIndexOf('/') + 1); 

è ancora più facile se si sa che la parte finale sarà sempre di 16 caratteri:

var final = id.substr(-16); 
+1

Non restituirà nulla l'url è ''http: // www.google.com/m8/feeds/contatti/mioemail% 40gmail.com/base/nabb80191e23b7d9 /'' –

+4

@AllanKimmerJensen Bene, non c'è niente dopo l'ultimo taglio lì, ovviamente. – lonesomeday

+1

Ho trovato questo argomento anche se stavo cercando una soluzione PHP. L'ho convertito, nel caso qualcuno fosse interessato: 'substr ($ id, strrpos ($ id,"/") + 1)' – Jan

26

Un po 'diverso approccio regex:

var afterSlashChars = id.match(/\/([^\/]+)\/?$/)[1]; 

Abbattere questa espressione regolare:

\/ match a slash 
( start of a captured group within the match 
[^\/] match a non-slash character 
+ match one of more of the non-slash characters 
) end of the captured group 
\/? allow one optional/at the end of the string 
$ match to the end of the string 

Il [1] recupera quindi il primo gruppo acquisito all'interno della partita

lavoro frammento:

var id = 'http://www.google.com/m8/feeds/contacts/myemail%40gmail.com/base/nabb80191e23b7d9'; 
 

 
var afterSlashChars = id.match(/\/([^\/]+)\/?$/)[1]; 
 

 
// display result 
 
document.write(afterSlashChars);

+0

Le spiegazioni rendono la tua risposta molto più preziosa di quella accettata. Grazie! –

+0

@IliaRostovtsev: Sfortunatamente, la spiegazione è sbagliata, così come la risposta. I quantificatori non grezzi non garantiscono la corrispondenza più breve possibile, perché riguardano solo il punto in cui termina * *, non dove inizia. Questa regex corrisponde alla * prima * barra alla fine. –

+0

@Alan Moore Non so perché ho scelto questa risposta, probabilmente perché mi ha adattato al momento. Grazie per la tua spiegazione. –

7

Non so JS, utilizzando altri esempi (e una supposizione) -

id = id.match(/[^\/]*$/); // [0] facoltativo?

+0

Solo per il record, la funzione di corrispondenza restituisce un array. L'utilizzo di [0] restituirà solo il primo. Non è opzionale. – Brduca

+0

Non ci sono gruppi di cattura in questa espressione regolare, la corrispondenza non è sovraccaricata per restituire l'intera corrispondenza se non si fa riferimento all'indice? – sln

7

Solo nel caso qualcun altro si imbatte in questa discussione e sta cercando una soluzione semplice JS:

id.split ('/') pop (-1)

+3

Facile, breve e bello. Ma l'argomento -1 sembra ridondante, dato che pop() restituisce sempre l'ultimo elemento. – JHH

7

questo è facile da capire (?!.*/).+.

mi spiego:

prima, lascia abbinare tutto ciò che ha una barra alla fine, ok? che è la parte non vogliamo

.*/ corrisponde tutto fino all'ultima barra

allora, facciamo un "lookahead negativo" (?!) a dire "Io non voglio questo, rifiutarlo"

(?!.*) questo è "lookahead negativo"

Ora possiamo tranquillamente prendere tutto ciò che è accanto a quello che non vogliamo con questo .+

POTREBBE bisogno di sfuggire alla/Così diventa:

(?!.*\/).+

+0

Quindi prendi l'ultimo oggetto dalla matrice risultante, Grazie amico – Husam

2

questa regexp: [^\/]+$ - funziona come un campione:

var id = ".../base/nabb80191e23b7d9" 

result = id.match(/[^\/]+$/)[0]; 

// results -> "nabb80191e23b7d9" 
Problemi correlati