Підрядок із зворотним індексом


79

Як я можу витягти "456" з "xxx_456", де xxx має невизначену довжину?


2
Це питання було б набагато кориснішим, якби його сформулювати загальним чином: "Як я можу витягти кінець рядка після останнього введення даного роздільника?".
Дан Даскалеску,

Відповіді:


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

Якщо це не завжди три цифри в кінці (і розділені підкресленням). Якщо кінцевий роздільник не завжди є підкресленням, тоді ви можете використовувати регулярний вираз:

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

1
+1 lastIndexOf - це саме те, що ви хочете тут, швидше, ніж регулярний вираз, і гнучкіше, ніж substr.
Phil H

7
@Phil: не помірно швидше, якщо це не викликано тисячі разів. Вам потрібно буде зателефонувати їм мільйони разів, перш ніж різниця буде помітною.
outis

184

slice чудово працює в IE та інших браузерах, це частина специфікації і це також найефективніший метод:

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

метод зрізу (рядок) - зріз MSDN
- Центр розробників Mozilla


Зверніть увагу, що зворотне не буде працювати:"xxx_456".slice(3)
user1429980

2
@ user1429980 Якщо з "зворотним" ви хочете видалити останні три цифри, це так"xxx_456".slice(0, -3)
здригання


5

ви можете просто розділити його і отримати останній елемент

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

1
+1, я б запропонував метод split-pop у своїй власній відповіді, якби ви не згадали про це :-)
Енді Е


3

Просте регулярне вираження для будь-якої кількості цифр у кінці рядка:

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

або справді використовуйте спліт / поп:

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

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

з використанням методу зворотного рядка

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

якщо ваш зворотний метод повертає рядок, то ланцюжок методів для більш чистого рішення.


в якому api відображається метод reverse ()?
Mike S.

@MikeS. будь ласка +1, якщо це допомогло
nf071590

2

Шалений підхід до регулярних виразів

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

також може бути 'xxx_456'.match (/_.+$/) [0] або' xxx_456'.replace (/(^.+_)(.+$)/,'$ 1 ')?
KooiInc

1
@Kooilnc: Не потрібно занадто ускладнювати регулярні вирази лише тому, що ви можете. Ваш перший приклад також відповідав би _.
Енді Е

@Andy E: ти маєш рацію щодо _. Друга можливість: 1 долар, до речі, повинен становити 2 долари.
KooiInc

2

ось моя спеціальна функція

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

Ця функція працює для зворотного індексу.


це комплекс? я щойно реалізував підрядок у зворотному порядку. Це воно. і це для того, що користувач просив із його заголовка.
кодер

1
занадто складний, просто використовуй"xxxxxxx_456".slice(-3)
tsukimi

2

Також ви можете отримати результат, використовуючи substringта lastIndexOf-

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

0

Незважаючи на те, що це старе питання, щоб підтримати відповідь на user187291

У разі фіксованої довжини бажаного підрядка я б використовував substr()негативний аргумент для його короткого та читабельного синтаксису

"xxx_456".substr(-3)

На даний момент він сумісний із загальноприйнятими браузерами і ще не є суто застарілим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.