Teilstring mit Rückwärtsindex

79

Wie kann ich "456" aus "xxx_456" extrahieren, wobei xxx eine unbestimmte Länge hat?

Ricky
quelle
2
Diese Frage wäre viel nützlicher, wenn sie allgemein formuliert würde: "Wie kann ich das Ende einer Zeichenfolge nach dem letzten Auftreten eines bestimmten Trennzeichens extrahieren?".
Dan Dascalescu

Antworten:

77
var str = "xxx_456";
var str_sub = strsstrstr (str.lastIndexOf ("_") + 1);

Wenn es nicht immer drei Ziffern am Ende sind (und durch einen Unterstrich getrennt sind). Wenn das Endtrennzeichen nicht immer ein Unterstrich ist, können Sie Regex verwenden:

var pat = / ([0-9] {1,}) $ /;
var m = str.match (pat);
Psytronic
quelle
1
+1 lastIndexOf ist genau das, was Sie hier wollen, schneller als Regex und flexibler als substr.
Phil H
7
@Phil: nicht messbar schneller, es sei denn, es wird tausende Male aufgerufen. Sie müssten sie millionenfach anrufen, bevor sich der Unterschied bemerkbar macht.
Outis
182

slice funktioniert gut in IE und anderen Browsern, ist Teil der Spezifikation und auch die effizienteste Methode:

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

Slice-Methode (Zeichenfolge) - MSDN-
Slice - Mozilla Developer Center

Andy E.
quelle
Beachten Sie, dass das Gegenteil nicht funktionieren würde:"xxx_456".slice(3)
user1429980
1
@ user1429980 Wenn Sie mit "umgekehrt" die letzten drei Ziffern entfernen "xxx_456".slice(0, -3)
Schauder
5

Sie können es einfach aufteilen und das letzte Element erhalten

var string="xxx_456";
var a=string.split("_");
alert(a[1]); #or a.pop
Ghostdog74
quelle
1
+1, ich hätte die Split-Pop-Methode in meiner eigenen Antwort angegeben, wenn Sie sie nicht erwähnt hätten :-)
Andy E
4
alert("xxxxxxxxxxx_456".substr(-3))

Vorbehalt: laut mdc nicht IE-kompatibel

user187291
quelle
3
aber sliceist - siehe meine Antwort.
Andy E
3

Einfache Regex für eine beliebige Anzahl von Ziffern am Ende einer Zeichenfolge:

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

oder verwenden Sie Split / Pop in der Tat:

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

mit einer Reverse-String-Methode

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

Wenn Ihre umgekehrte Methode den String zurückgibt, verketten Sie die Methoden für eine sauberere Lösung.

nf071590
quelle
In welcher API erscheint die reverse () Methode?
Mike S.
@ MikeS. bitte +1 wenn dies geholfen hat
nf071590
2

Ein verrückter Regex-Ansatz

"xxx_456".match(/...$/)[0] //456
SIE
quelle
könnte auch 'xxx_456'.match (/_.+$/) [0] oder' xxx_456'.replace (/(^.+_)(.+$)/,'$ 1 ') sein?
KooiInc
1
@Kooilnc: Keine Notwendigkeit, reguläre Ausdrücke zu komplizieren, nur weil Sie können. Ihr erstes Beispiel würde auch dem entsprechen _.
Andy E
@Andy E: Sie haben Recht mit dem _. Zweite Möglichkeit: $ 1 sollte übrigens $ 2 sein.
KooiInc
2

Hier ist meine benutzerdefinierte Funktion

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

Diese Funktion funktioniert für den umgekehrten Index.

Codierer
quelle
ist das komplex? Ich habe gerade Teilzeichenfolge in umgekehrter Weise implementiert. das ist es. und dies ist für das, was der Benutzer von seinem Titel verlangt.
Codierer
1
zu komplex, verwenden Sie einfach"xxxxxxx_456".slice(-3)
Tsukimi
2

Sie können das Ergebnis auch mit substringund lastIndexOf- erhalten

alert("xxx_456".substring("xxx_456".lastIndexOf("_")+1));
Mahfuzur Rahman
quelle
0

Obwohl dies eine alte Frage ist, um die Antwort von user187291 zu unterstützen

Bei fester Länge des gewünschten Teilstrings würde ich substr()mit negativem Argument für seine kurze und lesbare Syntax verwenden

"xxx_456".substr(-3)

Derzeit ist es mit gängigen Browsern kompatibel und noch nicht streng veraltet.

AlisaDu
quelle