Рядок JavaScript або jQuery закінчується функцією утиліти


Відповіді:


153

Ви можете використовувати регулярні вирази, наприклад:

str.match(/value$/)

що поверне true, якщо рядок має 'value' в кінці ($).


1
Невдалий тест: value = "test [az]". В іншому випадку: 'test [az]'.
Match

Зазвичай я спочатку не виймаю інструмент регулярного виразу зі своєї сумки, але це перевершує всі альтернативи (Рядок # кінцяWith підтримується спочатку лише у Firefox, а розширення / використання сторонніх js трохи надмірно)
diclophis

1
match () не повертає логічне значення. 'foobar'.match (/ bar $ /) повертає ["bar"]
Джонатан

1
RegEx Search () замість Match () буде кращим варіантом, якщо ми просто хочемо логічний результат. Search () поверне -1, якщо не знайдено. if (str.search (/ value $ /)! = -1) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
mitaka

39

Викрадено з prototypejs:

String.prototype.endsWith = function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
};

'slaughter'.endsWith('laughter');
// -> true

5
Деякі люди вважають, що модифікувати прототип основного класу - це те, чого не слід робити - Крокфорд називає це "глобальним зменшенням" у своїй книзі JavaScript: Гарні частини.
Уолтер Рамсбі, 07

4
Чому ви не повинні це робити? Або ти просто не робиш цього, бо це сказав Крокфорд?
Luca Matteis

11
Ви не повинні цього робити, оскільки це не гарантується для роботи у всіх реалізаціях JS: специфікація компактного профілю ECMAScript (ECMA-327: ecma-international.org/publications/standards/Ecma-327.htm ) визначає, що "Compact "реалізації (наприклад, на портативних пристроях, таких як телефони) не повинні її підтримувати (див. розділ 5.2). Навіть якщо вас це не турбує, цілком можливо, що це зламає новіші версії JS: наприклад, той, хто в минулому розгортав код, який додав метод "forEach" до Array.prototype, тепер порушує власну реалізацію в останніх версіях Firefox.
NickFitz

3
Якщо хтось не хоче змінювати String, він може дуже легко перетворити його на самостійну функцію.
studgeek


5

Мені не пощастило з підходом до матчу, але це спрацювало:

Якщо у вас є рядок, "Це мій рядок". і хотів побачити, чи закінчується крапка, зробіть так:

var myString = "This is my string.";
var stringCheck = ".";
var foundIt = (myString.lastIndexOf(stringCheck) === myString.length - stringCheck.length) > 0;
alert(foundIt);

Ви можете змінити змінну stringCheck на будь-який рядок для перевірки. Краще все-таки було б закинути це у власну функцію так:

function DoesStringEndWith(myString, stringCheck)
{
    var foundIt = (myString.lastIndexOf(stringCheck) === myString.length - stringCheck.length) > 0;
    return foundIt;
}

1
Дійсно приємно, @theJerm. Це працювало для мене в різних ситуаціях, тоді як .match не завжди.
Натан,

5

Ви можете зробити 'hello world'.slice(-5)==='world'. Працює у всіх браузерах. Набагато швидше, ніж регулярний вираз.



1

Я просто розширюю те, що розмістив @ luca-matteis, але для вирішення проблем, зазначених у коментарях, слід обернути код, щоб переконатись, що ви не перезаписуєте власну реалізацію.

if ( !String.prototype.endsWith ) {  
    String.prototype.endsWith = function(pattern) {
        var d = this.length - pattern.length;
        return d >= 0 && this.lastIndexOf(pattern) === d;
    };
}

Це запропонований метод для методу Array.prototype.forEach, зазначений у мережі розробників mozilla


0

Ви завжди можете створити прототип класу String, це буде працювати:

String.prototype.endsWith = function (str) {return (this.match (str + "$") == str)}

Інші пов’язані розширення для класу String можна знайти за адресою http://www.tek-tips.com/faqs.cfm?fid=6620


2
Це не вдасться, якщо str містить спеціальні символи регулярного виразу, наприклад "[ssss]".
studgeek

Це також не вдається, оскільки matchповертає масив. Це повинно було б бути this.match(str+"$")[0]===str(і це може не вдатися, якщо matchнічого не знайде - насправді не перевірило це)
TLS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.