¿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.