Pregunta ¿Cómo verificar si una cadena "comienza con" otra cadena?


Cómo escribiría el equivalente de C # 's String.StartsWith en JavaScript?

var haystack = 'hello world';
var needle = 'he';

//haystack.startsWith(needle) == true

Nota: Esta es una pregunta antigua, y como se señaló en los comentarios, ECMAScript 2015 (ES6) introdujo el .startsWith método. Sin embargo, en el momento de escribir esta actualización (2015) el soporte del navegador está lejos de ser completo.


1547
2018-03-14 20:12


origen


Respuestas:


Puede usar ECMAScript 6 String.prototype.startsWith() método, pero es aún no es compatible en todos los navegadores. Deberá usar un shim / polyfill para agregarlo en navegadores que no lo admitan. Crear una implementación que cumpla con todos los detalles establecidos en la especificación es un poco complicado, y la versión definida en esta respuesta no funcionará; si quieres un shim fiel, usa cualquiera de los siguientes:

Una vez que haya ajustado el método (o si solo está admitiendo navegadores y motores de JavaScript que ya lo tienen), puede usarlo así:

"Hello World!".startsWith("He"); // true

var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false

1655
2018-03-14 20:19



Otra alternativa con .lastIndexOf:

haystack.lastIndexOf(needle, 0) === 0

Esto mira hacia atrás a través de haystack para una ocurrencia de needle comenzando desde el índice 0 de haystack. En otras palabras, solo verifica si haystack comienza con needle.

En principio, esto debería tener ventajas de rendimiento sobre algunos otros enfoques:

  • No busca la totalidad haystack.
  • No crea una nueva cadena temporal y luego la descarta inmediatamente.

1226
2018-01-02 16:14



data.substring(0, input.length) === input

569
2018-03-14 20:14



Sin una función de ayuda, solo usando expresiones regulares .test método:

/^He/.test('Hello world')

Para hacer esto con una cadena dinámica en lugar de una codificada (suponiendo que la cadena no contendrá ningún carácter de control de expresiones regulares):

new RegExp('^' + needle).test(haystack)

Deberías echarle un vistazo ¿Hay una función RegExp.escape en Javascript? si existe la posibilidad de que los caracteres de control regexp aparezcan en la cadena.


180
2018-01-04 00:59



Solo quería agregar mi opinión sobre esto.

Creo que podemos usar esto:

var haystack = 'hello world';
var needle = 'he';

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}

50
2018-02-12 14:47



Mejor solución:

function startsWith(str, word) {
    return str.lastIndexOf(word, 0) === 0;
}

startsWith("aaa", "a")
true
startsWith("aaa", "ab")
false
startsWith("abc", "abc")
true
startsWith("abc", "c")
false
startsWith("abc", "a")
true
startsWith("abc", "ba")
false
startsWith("abc", "ab")
true

Y aquí está termina con si lo necesitas también:

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

Para aquellos que prefieren prototiparlo en String: 

String.prototype.startsWith || (String.prototype.startsWith = function(word) {
    return this.lastIndexOf(word, 0) === 0;
});

String.prototype.endsWith   || (String.prototype.endsWith = function(word) {
    return this.indexOf(word, this.length - word.length) !== -1;
});

Uso: 

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true

42
2018-04-26 21:56



Aquí hay una mejora menor a la solución de CMS:

if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

"Hello World!".startsWith("He"); // true

 var data = "Hello world";
 var input = 'He';
 data.startsWith(input); // true

Verificando si la función ya existe en caso de que un futuro navegador la implemente en código nativo o si es implementada por otra biblioteca. Por ejemplo, la Biblioteca de prototipos ya implementa esta función.

Utilizando ! es un poco más rápido y más conciso que === 0 aunque no tan legible


37
2018-05-27 02:54



También echa un vistazo underscore.string.js. Viene con un montón de métodos útiles de prueba y manipulación de cadenas, incluyendo un startsWith método. De los documentos:

comienza con  _.startsWith(string, starts)

Este método verifica si string comienza con starts.

_("image.gif").startsWith("image")
=> true

21
2018-05-31 18:29