2012-06-04 13 views
8

Ho una stringa di testo che può essere un numero qualsiasi di caratteri che desidero collegare un numero di ordine alla fine. Quindi posso togliere il numero dell'ordine quando ho bisogno di usarlo di nuovo. Dal momento che c'è una possibilità che il numero è di lunghezza variabile, vorrei fare un'espressione regolare che tutto è fermo dopo il segno = nella stringa ?order_num=regex - ottieni numeri dopo una determinata stringa di caratteri

Così l'intera stringa sarebbe

"aijfoi aodsifj adofija afdoiajd?order_num=3216545" 

ho ho provato ad usare il generatore di espressioni regolari online ma senza fortuna. Qualcuno può per favore aiutarmi a estrarre il numero alla fine e metterli in una variabile e qualcosa di mettere ciò che precede lo ?order_num=203823 nella propria variabile.

Pubblicherò alcuni tentativi per conto mio, ma prevedo fallimento e confusione.

risposta

18
var s = "aijfoi aodsifj adofija afdoiajd?order_num=3216545"; 

var m = s.match(/([^\?]*)\?order_num=(\d*)/); 
var num = m[2], rest = m[1]; 

ma ricordate che le espressioni regolari sono lento. Utilizzare indexOf e substring/slice quando è possibile. Ad esempio:

var p = s.indexOf("?"); 
var num = s.substring(p + "?order_num=".length), rest = s.substring(0, p); 
+1

hm. non lo sapevo! Ho sempre pensato che, dato che erano estremamente difficili, dovevano essere bravi ... Penso che userò questo se è davvero più veloce. Grazie! – 1252748

+0

'([^ \?] *) \? Order_num = (\ d *)' dovrebbe essere '([^ #?] *) \? Order_num = (\ d *)'. Meglio ancora: '([^ #?] *) [? &] Order_num = (\ d *)'. Anche allora, questo non gestisce il carattere di escape in order_num o il numero. Perché JS non ha un parser di URL incorporato? – ikegami

+0

@thomas Well regexps * sono * buoni perché consentono di fare in un'unica riga ciò che si fa in diverse righe di codice. Essere così potente significa anche essere più lento. Per non parlare del modo più difficile da mantenere ... finirai per riscrivere le tue espressioni regolari invece di risolverle. – MaxArt

9

vedo alcuna necessità di regex per questo:

var str="aijfoi aodsifj adofija afdoiajd?order_num=3216545"; 
var n=str.split("?"); 

n sarà quindi un array, dove l'indice 0 è la prima? e l'indice 1 è dopo.

Un altro esempio:

var str="aijfoi aodsifj adofija afdoiajd?order_num=3216545"; 
var n=str.split("?order_num="); 

vi darà il risultato: n[0] = aijfoi aodsifj adofija afdoiajd e n[1] = 3216545

+1

Tenendo presente che vuole ottenere la parte dopo il '=' ... ma in caso contrario, sì. –

+2

+1 Dividi su '&' e poi su '=' e puoi anche gestire 'afdoiajd? Iminyourstring = 21312 & order_num = 3216545 & throwingyouoff = 231221' – Paulpro

+0

@DavidThomas Grazie, ho aggiunto un esempio per questo. –

2

È possibile sottostringa dalla prima istanza di ? in poi, e poi regex di sbarazzarsi della maggior parte delle complessità nell'espressione e migliorare le prestazioni (che è probabilmente trascurabile in ogni caso e non qualcosa di cui preoccuparsi a meno che non si stia facendo questo su migliaia di iterazioni). inoltre, questo corrisponderà a order_num= in qualsiasi punto all'interno della querystring, non necessariamente proprio alla fine della querystring.

var match = s.substr(s.indexOf('?')).match(/order_num=(\d+)/); 
if (match) { 
    alert(match[1]); 
} 
+0

+1 Perché la tua risposta prende in considerazione la possibilità che le cifre potrebbero non essere alla fine della stringa. Grazie! –

Problemi correlati