¿Cómo saber que una cadena comienza / termina con una cadena específica en jQuery?


206

Quiero saber si una cadena comienza con el carácter / cadena especificada o termina con ella en jQuery.

Por ejemplo:

var str = 'Hello World';

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

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

Si no hay ninguna función, ¿hay alguna alternativa?



2
Sí, bueno, o no uses ES6 todavía si tienes usuarios que usan IE anterior a Edge.
— Antares42

Respuestas:


388

Una opción es usar expresiones regulares:

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

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

1
en jQuery probé str.startsWith ('alguna cadena de verificación ...') esto me dio un error que decía, comienza con el método no encontrado ... :( pero str.match funcionó. Gracias por su respuesta
— Débora

2
Solo tenga cuidado de que la cadena que está inspeccionando no contenga caracteres reservados de expresiones regulares.
— nokturnal

23
Pasar un objeto regex en lugar de una cadena regex parece resolver el problema que @nokturnal menciona: str.match(/^Hello/)Pero la forma /regex/.test(str)es aún mejor para este caso particular, por stackoverflow.com/questions/10940137/…
— CrazyPyro

Esto devolvería una cadena coincidente, pero no un valor booleano.
— RajKumar Samala

var isUnavailable = $("#StatusId option:selected").text().match("^Unavailable - ");- ¿Por qué esto devuelve nulo cuando la opción seleccionada es "No disponible - Otro"?
— egmfrs

96

Para empezar, puedes usar indexOf:

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

...

árbitro

y puede hacer los cálculos en función de la longitud de la cadena para determinar 'endswith'.

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

11
es posible que desee utilizar lastIndexOf()para el finalwith;)
— Reigel

Cuidado, IndexOf no es compatible con el navegador IE8. Lo mismo con lastIndexOf.
— Pedro Lopes

1
Me disculpo por la confusión. Me refería a Array.prototype.indexOf () que solo es compatible con iE9 + y no String.prototype.indexOf () que es IE4 +
— Pedro Lopes

3
Una respuesta mucho más segura que usar expresiones regulares para un caso de uso tan simple. Probablemente debería aceptarse la respuesta.
— AntonChanning

1
El código para 'endswith' es defectuoso. Al verificar una cadena que no aparece en la cadena y que tiene la longitud = (palabra - 1). P.ej. ("1234".lastIndexOf('Hello') == "1234".length - 'Hello'.length)resultados en verdad.
— Nick Russler

23

No hay necesidad de jQuery para hacer eso. Puede codificar un contenedor jQuery pero sería inútil, por lo que debería usarlo mejor

var str = "Hello World";

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

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

ya que el método match () está en desuso.

PD: el indicador "i" en RegExp es opcional y no distingue entre mayúsculas y minúsculas (por lo que también será verdadero para "hola", "hola", etc.).


2
¿Puede proporcionar un enlace a la documentación sobre match () en desuso? Una búsqueda rápida en Google no devuelve nada.
— Cavyn VonDeylen

1
Lo leí en línea hace unos años, me temo que ya no puedo encontrar dónde exactamente.
— Sebastien P.

16

Realmente no necesita jQuery para tales tareas. En la especificación ES6, ya tienen métodos listos para usar arranca con y termina con .

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

Actualmente disponible en FF y Chrome . Para navegadores antiguos, puede usar sus polyfills o substr


10

Siempre puedes extender un Stringprototipo como este:

//  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;
    };
}

Y úsalo así:

var str = 'Hello World';

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

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

2

ES6 ahora admite el método startsWith()y endsWith()para verificar el comienzo y el final de strings. Si desea admitir motores pre-es6, puede considerar agregar uno de los métodos sugeridos al Stringprototipo.

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

Cualquier cadena que contenga caracteres que se deban escapar para el uso en una expresión regular (por ejemplo ()[].) romperá sus métodos de polyfill. Necesita preparar las cadenas con una función regex-escape. O incluso mejor: usa un polyfill probado en batalla decore-js
— nirazul
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.