заканчивается в JavaScript - PullRequest
       100

заканчивается в JavaScript

1066 голосов
/ 11 ноября 2008

Как я могу проверить, заканчивается ли строка определенным символом в JavaScript?

Пример: у меня есть строка

var str = "mystring#";

Я хочу знать, заканчивается ли эта строка #. Как я могу это проверить?

  1. Есть ли в JavaScript метод endsWith()?

  2. Одно из решений, которое у меня есть, это взять длину строки и получить последний символ и проверить его.

Это лучший способ или есть какой-то другой способ?

Ответы [ 31 ]

1745 голосов
/ 30 марта 2010

ОБНОВЛЕНИЕ (24 ноября 2015 г.):

Этот ответ первоначально был опубликован в 2010 году (шесть лет назад), поэтому, пожалуйста, обратите внимание на эти проницательные комментарии:


ОРИГИНАЛЬНЫЙ ОТВЕТ:

Я знаю, что это годичный вопрос ... но мне это тоже нужно, и мне нужно, чтобы он работал кросс-браузерно, так что ... объединяя ответы и комментарии каждого и немного упрощая его:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
  • Не создает подстроку
  • Использует встроенную функцию indexOf для самых быстрых результатов
  • Пропустить ненужные сравнения, используя второй параметр indexOf, чтобы пропустить вперед
  • Работает в Internet Explorer
  • ОТСУТСТВИЕ осложнений Regex

Также, если вам не нравится вставлять вещи в прототипы нативной структуры данных, вот отдельная версия:

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

РЕДАКТИРОВАТЬ: Как отметил @hamish в комментариях, если вы хотите ошибиться и убедиться, что реализация уже предоставлена, вы можете просто добавить проверку typeof следующим образом :

if (typeof String.prototype.endsWith !== 'function') {
    String.prototype.endsWith = function(suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}
291 голосов
/ 24 марта 2009
/#$/.test(str)

будет работать во всех браузерах, не требует исправления обезьян String и не требует сканирования всей строки, как lastIndexOf, когда нет совпадений.

Если вы хотите сопоставить константную строку, которая может содержать специальные символы регулярного выражения, такие как '$', то вы можете использовать следующее:

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

и тогда вы можете использовать это так

makeSuffixRegExp("a[complicated]*suffix*").test(str)
86 голосов
/ 11 ноября 2008
  1. К сожалению, нет.
  2. if( "mystring#".substr(-1) === "#" ) {}
66 голосов
/ 27 сентября 2009

Да ладно, это правильная endsWith реализация:

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

с использованием lastIndexOf просто создает ненужные циклы ЦП, если совпадений нет.

56 голосов
/ 11 ноября 2008

Эта версия избегает создания подстроки и не использует регулярные выражения (некоторые ответы регулярных выражений здесь будут работать; другие не работают):

String.prototype.endsWith = function(str)
{
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

Если производительность важна для вас, стоит проверить, действительно ли lastIndexOf быстрее, чем создание подстроки или нет. (Это может зависеть от того, какой движок JS вы используете ...) Он может быть быстрее в подходящем случае, и когда строка мала, но когда строка огромна, ей нужно оглянуться через все хотя нам на самом деле все равно: (

Для проверки одного символа лучше всего найти длину и затем использовать charAt.

24 голосов
/ 09 июня 2015

Не видел apporach методом slice. Так что я просто оставлю это здесь:

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}
17 голосов
/ 04 марта 2009
return this.lastIndexOf(str) + str.length == this.length;

не работает в случае, когда длина исходной строки на единицу меньше длины строки поиска и строка поиска не найдена:

lastIndexOf возвращает -1, затем вы добавляете длину строки поиска, и у вас остается длина исходной строки.

Возможное исправление:

return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length
14 голосов
/ 05 марта 2014

От developer.mozilla.org String.prototype.endsWith ()

Краткое описание

Метод endsWith() определяет, заканчивается ли строка символами другой строки, возвращая в зависимости от ситуации true или false.

Синтаксис

str.endsWith(searchString [, position]);

Параметры

  • searchString : Символы, которые нужно найти в конце этой строки.

  • позиция : Поиск в этой строке, как если бы эта строка была только этой длинной; по умолчанию - фактическая длина этой строки, ограниченная в диапазоне, установленном длиной этой строки.

Описание

Этот метод позволяет определить, заканчивается ли строка другой строкой.

Примеры

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

Технические характеристики

Спецификация языка ECMAScript 6-е издание (ECMA-262)

Совместимость браузера

Browser compatibility

9 голосов
/ 11 ноября 2008
if( ("mystring#").substr(-1,1) == '#' )

- или -

if( ("mystring#").match(/#$/) )
8 голосов
/ 17 октября 2012
String.prototype.endsWith = function(str) 
{return (this.match(str+"$")==str)}

String.prototype.startsWith = function(str) 
{return (this.match("^"+str)==str)}

Надеюсь, это поможет

var myStr = “  Earth is a beautiful planet  ”;
var myStr2 = myStr.trim();  
//==“Earth is a beautiful planet”;

if (myStr2.startsWith(“Earth”)) // returns TRUE

if (myStr2.endsWith(“planet”)) // returns TRUE

if (myStr.startsWith(“Earth”)) 
// returns FALSE due to the leading spaces…

if (myStr.endsWith(“planet”)) 
// returns FALSE due to trailing spaces…

традиционный способ

function strStartsWith(str, prefix) {
    return str.indexOf(prefix) === 0;
}

function strEndsWith(str, suffix) {
    return str.match(suffix+"$")==suffix;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...