2010-03-08 21 views
60

¿Cómo puedo extraer "456" de "xxx_456" donde xxx es de longitud indefinida?Subcadena con índice inverso

+1

Esta pregunta sería mucho más útil si se expresara de forma general: "¿Cómo puedo extraer el final de una cadena después de la última aparición de un delimitador dado?". –

Respuesta

60
 
var str = "xxx_456"; 
var str_sub = str.substr(str.lastIndexOf("_")+1); 

Si no siempre es tres dígitos en el final (y separado por un guión bajo). Si el delimitador final no es siempre un guión bajo, entonces se podría utilizar expresiones regulares:

 
var pat = /([0-9]{1,})$/; 
var m = str.match(pat); 
+1

+1 lastIndexOf es exactamente lo que quiere aquí, más rápido que regex y más flexible que substr. –

+7

@Phil: no es mucho más rápido, a menos que se lo llame miles de veces. Tendrás que llamarlos millones de veces antes de que la diferencia sea notable. – outis

21

El método substring le permite especificar comenzar y el índice final:

var str = "xxx_456"; 
var subStr = str.substring(str.length - 3, str.length); 
2
alert("xxxxxxxxxxx_456".substr(-3)) 

advertencia: de acuerdo a mdc, es decir, no es compatible

+3

pero 'slice' es - ver mi respuesta. –

2

una expresión regular loca enfoque

"xxx_456".match(/...$/)[0] //456 
+0

también podría ser 'xxx_456'.match (/_.+$/) [0] o' xxx_456'.replace (/(^.+_)(.+$)/,'$ 1 ')? – KooiInc

+1

@Kooilnc: no es necesario complicar demasiado las expresiones regulares solo porque puede. Su primer ejemplo también coincidiría con el '_'. –

+0

@Andy E: tienes razón sobre el _. Segunda posibilidad: $ 1 debería ser $ 2 por cierto. – KooiInc

4

sólo puede dividirlo y obtener el último elemento

var string="xxx_456"; 
var a=string.split("_"); 
alert(a[1]); #or a.pop 
+0

+1, habría proporcionado el método split-pop en mi propia respuesta si no lo hubiera mencionado :-) –

2

aquí es mi función personalizada

function reverse_substring(str,from,to){ 
    var temp=""; 
    var i=0; 
    var pos = 0; 
    var append;  
    for(i=str.length-1;i>=0;i--){ 
    //alert("inside loop " + str[i]); 
    if(pos == from){ 
     append=true; 
    } 

    if(pos == to){ 
     append=false; 
     break; 
    } 
    if(append){ 
     temp = str[i] + temp; 
    } 
    pos++; 
    } 
    alert("bottom loop " + temp); 
} 

var str = "bala_123"; 
reverse_substring(str,0,3); 

Esta función se puede utilizar para el índice inverso.

+2

¿No es demasiado complejo? – Kamarey

+0

es este complejo? acabo de implementar la subcadena de manera inversa. Eso es. y esto es por lo que el usuario pidió de su título. – coder

+1

demasiado complejo, simplemente use '" xxxxxxx_456 ".slice (-3)' – tsukimi

1

expresión regular simple para cualquier número de dígitos al final de una cadena:

'xxx_456'.match(/\d+$/)[0]; //456 
'xxx_4567890'.match(/\d+$/)[0]; //4567890 

o utilizar split/pop de hecho:

('yyy_xxx_45678901').split(/_/).pop(); //45678901 
2
String.prototype.reverse() { 
    return Array.prototype.slice.call(this) 
      .reverse() 
      .join() 
      .replace(/,/g,'') 
} 

utilizando un método de cadena inversa

var str = "xxx_456" 
str = str.reverse() // 654_xxx 
str = str.substring(0,3) // 654 
str = str.reverse() //456 

si su método inverso devuelve el str Luego, encadena los métodos para una solución más limpia.

+0

en qué api aparece el método reverse()? –

+0

@MikeS. Edité mi respuesta, gracias. – nf071590

+0

@MikeS. por favor +1 si esto ayudó – nf071590