Як знати, що рядок починається / закінчується певним рядком в jQuery?


206

Я хочу знати, чи починається рядок із вказаного символу / рядка чи закінчується ним у jQuery.

Наприклад:

var str = 'Hello World';

if( str starts with 'Hello' ) {
   alert('true');
} else {
   alert('false');
}

if( str ends with 'World' ) {
   alert('true');
} else {
   alert('false');
}

Якщо немає жодної функції, то будь-яка альтернатива?



2
Так, або ще не використовуйте ES6, якщо у вас є користувачі, які використовують IE старше Edge.
Antares42

Відповіді:


388

Один варіант - використовувати регулярні вирази:

if (str.match("^Hello")) {
   // do this if begins with Hello
}

if (str.match("World$")) {
   // do this if ends in world
}

1
у jQuery я спробував str.startsWith ('деяка перевіряюча рядок ..'), це дало мені помилку, сказавши, метод startWith не знайдено .. :( але str.match працював. Дякую за вашу відповідь
Дебора

2
Будьте обережні, рядок, який ви перевіряєте, не містить символів, що резервуються за регулярними виразами.
nokturnal

23
Передача об'єкта регулярного виразу замість регулярних виразів рядки , здається, вирішити проблему @nokturnal згадує: str.match(/^Hello/)Але форма /regex/.test(str)ще краще для цього конкретного випадку, в stackoverflow.com/questions/10940137 / ...
CrazyPyro

Це поверне відповідне рядок, але не булеве значення.
RajKumar Samala

var isUnavailable = $("#StatusId option:selected").text().match("^Unavailable - ");- чому це повертається нульовим, якщо вибраний параметр "Недоступно - інше"?
egmfrs

96

Для запуску, ви можете використовувати indexOf:

if(str.indexOf('Hello') == 0) {

...

реф

і ви можете робити математику на основі довжини рядка, щоб визначити "endwith".

if(str.lastIndexOf('Hello') == str.length - 'Hello'.length) {

11
ви можете використати lastIndexOf()для кінця;)
Рейгель

Обережно, IndexOf не підтримується в браузері IE8. Те саме з lastIndexOf.
Педро Лопес

1
Прошу вибачення за плутанину. Я мав на увазі Array.prototype.indexOf (), який підтримується лише для iE9 +, а не String.prototype.indexOf (), це IE4 +
Педро Лопес

3
Набагато безпечніша відповідь, ніж використання регулярних виразів для такого простого випадку використання. Напевно, слід прийняти відповідь.
AntonChanning

1
Несправний код для 'endwith'. Під час перевірки на рядок, який не відображається в рядку і має довжину = (слово - 1). E. g. ("1234".lastIndexOf('Hello') == "1234".length - 'Hello'.length)приводить до справжнього.
Нік Расслер

23

Для цього не потрібно jQuery. Ви можете кодувати оболонку jQuery, але це було б марно, тому вам слід краще використовувати

var str = "Hello World";

window.alert("Starts with Hello ? " + /^Hello/i.test(str));        

window.alert("Ends with Hello ? " + /Hello$/i.test(str));

оскільки метод match () застарілий.

PS: прапор "i" в RegExp є необов'язковим і позначає нечутливі регістри (тому він також поверне істину для "привіт", "hEllo" тощо).


2
Чи можете ви надати посилання на застарілу документацію матчу ()? Швидкий пошук Google нічого не повертає.
Cavyn VonDeylen

1
Я прочитав це в Інтернеті кілька років тому, боюся, що більше не можу знайти де саме.
Себастьян П.

16

Вам не дуже потрібен jQuery для таких завдань. У специфікації ES6 у них вже є нестандартні методи startWith і endWith .

var str = "To be, or not to be, that is the question.";
alert(str.startsWith("To be"));         // true
alert(str.startsWith("not to be"));     // false
alert(str.startsWith("not to be", 10)); // true

var str = "To be, or not to be, that is the question.";
alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

На даний момент доступний у FF та Chrome . Для старих веб-переглядачів ви можете використовувати їх поліфауни або субстр


10

Ви завжди можете розширити Stringпрототип так:

//  Checks that string starts with the specific string
if (typeof String.prototype.startsWith != 'function') {
    String.prototype.startsWith = function (str) {
        return this.slice(0, str.length) == str;
    };
}

//  Checks that string ends with the specific string...
if (typeof String.prototype.endsWith != 'function') {
    String.prototype.endsWith = function (str) {
        return this.slice(-str.length) == str;
    };
}

І використовуйте його так:

var str = 'Hello World';

if( str.startsWith('Hello') ) {
   // your string starts with 'Hello'
}

if( str.endsWith('World') ) {
   // your string ends with 'World'
}

2

ES6 тепер підтримує startsWith()та endsWith()метод перевірки початку та кінця strings. Якщо ви хочете підтримувати двигуни pre-es6, ви можете розглянути можливість додавання до Stringпрототипу одного із запропонованих методів .

if (typeof String.prototype.startsWith != 'function') {
  String.prototype.startsWith = function (str) {
    return this.match(new RegExp("^" + str));
  };
}

if (typeof String.prototype.endsWith != 'function') {
  String.prototype.endsWith = function (str) {
    return this.match(new RegExp(str + "$"));
  };
}

var str = "foobar is not barfoo";
console.log(str.startsWith("foob"); // true
console.log(str.endsWith("rfoo");   // true

Будь-яка рядок, що містить символи, які потрібно уникнути для використання в регулярному вираженні (наприклад ()[].), порушить ваші методи поліфазування. Вам потрібно підготувати рядки з функцією regex-escape. Або ще краще: використовуйте випробуваний на бою core-js
поліфіл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.