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

Naveed
fuente
Utilice las nuevas funciones de ES6
Salvador Dali
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
}
Lukáš Lalinský
fuente
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) {
sje397
fuente
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.).

Sebastien P.
fuente
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

Salvador Dalí
fuente
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'
}
Señor calabaza
fuente
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
16kb
fuente
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