2012-06-04 18 views
8

Tengo una cadena de texto que puede contener cualquier cantidad de caracteres a los que me gustaría adjuntar un número de pedido hasta el final. Entonces puedo arrancar el número de orden cuando necesito volver a usarlo. Dado que hay una posibilidad de que el número es de longitud variable, me gustaría hacer una expresión regular que todo de captura después de la señal = en la cadena ?order_num=regex: obtener números después de cierta cadena de caracteres

Así que toda la cadena sería

"aijfoi aodsifj adofija afdoiajd?order_num=3216545" 

tengo intentado usar el generador de expresiones regulares en línea pero sin suerte. ¿Puede alguien ayudarme con la extracción del número al final y ponerlos en una variable y algo para poner lo que viene antes del ?order_num=203823 en su propia variable.

Voy a publicar algunos intentos por mi cuenta, pero preveo el fracaso y la confusión.

Respuesta

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

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

pero recuerda que las expresiones regulares son lenta. Use indexOf y substring/slice cuando pueda. Por ejemplo:

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

hm. ¡No sabía eso! Siempre pensé que dado que eran extremadamente difíciles, tenían que ser ... buenos. Creo que usaré esto si es más rápido. ¡Gracias! – 1252748

+0

'([^ \?] *) \? Order_num = (\ d *)' debe ser '([^ #?] *) \? Order_num = (\ d *)'. Mejor aún: '([^ #?] *) [? &] Order_num = (\ d *)'. Incluso entonces, eso no maneja el carácter escapado en order_num o el número. ¿Por qué JS no tiene un analizador de URL incorporado? – ikegami

+0

@thomas Las expresiones regulares bien * son * buenas porque te permiten hacer en una línea lo que normalmente haces en varias líneas de código. Al ser tan poderoso, también significa ser más lento. Sin mencionar que es mucho más difícil de mantener ... terminarás reescribiendo tus propias expresiones regulares en lugar de arreglarlas. – MaxArt

9

no veo ninguna necesidad de expresiones regulares para esto:

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

n A continuación tendrá lugar una matriz, donde el índice 0 es antes de que el? y el índice 1 es después.

Otro ejemplo:

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

le dará el resultado: n[0] = aijfoi aodsifj adofija afdoiajd y n[1] = 3216545

+1

Teniendo en cuenta que él quiere obtener la parte después del '=' ... pero de lo contrario, sí. –

+2

+1 Luego divide en '&' y luego en '=' e incluso puedes manejar 'afdoiajd? Iminyourstring = 21312 & order_num = 3216545 & throwingyouoff = 231221' – Paulpro

+0

@DavidThomas Gracias, he agregado un ejemplo para eso. –

2

Puede subcadena de la primera instancia de ? adelante, y luego de expresiones regulares para deshacerse de la mayoría de las complejidades en la expresión, y mejorar el rendimiento (que probablemente sea insignificante de todos modos y no es algo de lo que preocuparse a menos que esté haciendo esto en miles de iteraciones). Además, esto coincidirá con order_num= en cualquier punto dentro de la cadena de consulta, no necesariamente justo al final de la cadena de consulta.

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

+1 Porque su respuesta toma en consideración la posibilidad de que los dígitos no estén al final de la cadena. ¡Gracias! –

Cuestiones relacionadas