Как узнать, что строка начинается / заканчивается определенной строкой в ​​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');
}

Если нет никакой функции, тогда какая альтернатива?

Навид
источник
Используйте новые функции ES6
Сальвадор Дали
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 ('некоторая проверяющая строка ..'), это дало мне сообщение об ошибке, с именем метода setsWith не найдено .. :( но str.match сработал. Спасибо за ваш ответ
Débora
2
Просто будьте осторожны: проверяемая строка не содержит никаких зарезервированных символов регулярного выражения.
ноктюрн
23
Передача объекта регулярного выражения вместо строки регулярного выражения, кажется, решает проблему, о которой упоминает @nokturnal: str.match(/^Hello/)но форма /regex/.test(str)еще лучше для этого конкретного случая, для stackoverflow.com/questions/10940137/…
CrazyPyro
Это вернет совпавшую строку, но не логическое значение.
РаджКумар Самала
var isUnavailable = $("#StatusId option:selected").text().match("^Unavailable - ");- почему возвращается нулевое значение, если выбран вариант «Недоступен - Другой»?
egmfrs
96

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

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

...

ссылка

и вы можете сделать математику, основанную на длине строки, чтобы определить «заканчивается».

if(str.lastIndexOf('Hello') == str.length - 'Hello'.length) {
sje397
источник
11
Вы можете использовать lastIndexOf()для концов с;)
Рейгель
Осторожно, IndexOf не поддерживается в браузере IE8. То же самое с lastIndexOf.
Педро Лопес
1
Я прошу прощения за путаницу. Я имел в виду Array.prototype.indexOf (), который поддерживается только для iE9 +, а не String.prototype.indexOf (), это IE4 +
Pedro Lopes
3
Гораздо более безопасный ответ, чем использование регулярных выражений для такого простого варианта использования. Наверное, должен быть принят ответ.
AntonChanning
1
Код для «заканчивается» неисправен. При проверке строки, которая не отображается в строке и имеет длину = (слово - 1). Например ("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 является необязательным и обозначает регистр без учета регистра (поэтому он также возвращает true для «hello», «hEllo» и т. Д.).

Себастьян П.
источник
2
Можете ли вы предоставить ссылку на документацию по устаревшей функции match ()? Быстрый поиск в Google ничего не возвращает.
Кавин ФонДейлен
1
Я читал это онлайн несколько лет назад, боюсь, я больше не могу найти где именно.
Себастьян П.
16

Вам не нужен JQuery для таких задач. В спецификации ES6 у них уже есть готовые методы beginWith и 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 . Для старых браузеров вы можете использовать их polyfills или substr

Сальвадор Дали
источник
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()and 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
16kb
источник
Любая строка, содержащая символы, которые необходимо экранировать для использования в регулярном выражении (например ()[].), нарушит ваши методы polyfill. Вам нужно подготовить строки с помощью функции regex-escape. Или еще лучше: используйте проверенный в бою полифилл отcore-js
nirazul