[javascript] Substring with reverse index

How can I extract "456" from "xxx_456" where xxx is of indefinite length?

This question is related to javascript string

The answer is


slice works just fine in IE and other browsers, it's part of the specification and it's the most efficient method too:

alert("xxx_456".slice(-3));
//-> 456

slice Method (String) - MSDN
slice - Mozilla Developer Center


String.prototype.reverse( ) {
     return Array.prototype.slice.call(this)
          .reverse()
          .join()
          .replace(/,/g,'')
}

using a reverse string method

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

if your reverse method returns the string then chain the methods for a cleaner solution.


Simple regex for any number of digits at the end of a string:

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

or use split/pop indeed:

('yyy_xxx_45678901').split(/_/).pop(); //45678901

here is my custom function

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);

This function works for reverse index.


The substring method allows you to specify start and end index:

var str = "xxx_456";
var subStr = str.substring(str.length - 3, str.length);

Although this is an old question, to support answer by user187291

In case of fixed length of desired substring I would use substr() with negative argument for its short and readable syntax

"xxx_456".substr(-3)

For now it is compatible with common browsers and not yet strictly deprecated.


alert("xxxxxxxxxxx_456".substr(-3))

caveat: according to mdc, not IE compatible


you can just split it up and get the last element

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

Also you can get the result by using substring and lastIndexOf -

alert("xxx_456".substring("xxx_456".lastIndexOf("_")+1));

A crazy regex approach

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