2011-02-14 16 views
11

No estoy muy familiarizado con la expresión regular. Estaba tratando de probar si una cadena termina con otra cadena. El código a continuación devuelve nulo cuando esperaba verdadero. ¿Qué pasa con el código?La cadena Regex termina sin funcionar en Javascript

var id = "John"; 
var exists ="blahJohn".match(/id$/); 
alert(exists); 

Respuesta

17

Pues bien, con este enfoque, lo que tendría que utilizar el RegExp constructor, para construir una expresión regular la utilización de su id variables:

var id = "John"; 
var exists = new RegExp(id+"$").test("blahJohn"); 
alert(exists); 

Pero hay muchas maneras de lograr eso, por ejemplo, puede tomar los últimos caracteres id.length de la cadena y compararla con id:

var id = "John"; 
var exist = "blahJohn".slice(-id.length) == id; // true 
+0

' var id = "Ke $ ha"; ' –

0

Prueba esto -

var reg = "/" + id + "$/"; 
var exists ="blahJohn".match(reg); 
+0

No funciona. –

+1

@Tony - ¿Por qué esto no funciona? ¿Puedes explicar por favor? Creo que esto debería funcionar bien. –

1

La manera más agradable de hacer esto es utilizar RegExp.test:

(new RegExp(id + '$')).test('blahJohn'); // true 
(new RegExp(id + '$')).test('blahJohnblah'); // false 

Incluso mejor sería construir una función simple como esto:

function strEndsWith (haystack, needle) { 
    return needle === haystack.substr(0 - needle.length); 
} 

strEndsWith('blahJohn', id); // true 
strEndsWith('blahJohnblah', id); // false 
+0

El método 'substr' en IE <9 tiene errores, no puede manejar índices negativos, por ejemplo, pruebas:' 'abc'.substr (-1) ==' c'' falla, el 'substr' de IE devuelve toda la cadena. Yo recomendaría el 'slice' en su lugar. Aclamaciones. – CMS

+0

@CMS Gracias. No lo cambiaré, ya que tu respuesta es aceptada. – lonesomeday

2

Necesitarás utilizar un objeto RegExp() de hacer eso, no un literal:

var id = "John", 
    reg = new RegExp(id+"$"); 

alert(reg.test("blahJon")); 

Es decir, si usted no sabe el valor está tratando de detectar por delante de tiempo de ejecución. De lo contrario se podría hacer:

alert(/John$/.test("blahJohn")); 
+0

debería ser /John$/.test("blahJohn ") – Claudijo

0
var id = new RegExp("John"); 
var exists ="blahJohn".match(id); 
alert(exists); 

probar esto

0

¿Por qué usar RegExp? Es caro.

function EndsWith(givenStr, subst) 
{ 
var ln = givenStr.length; 
var idx = ln-subst.length; 
return (giventStr.subst(idx)==subst); 
} 

Mucho más fácil y rentable, ¿verdad?

+0

esto no funcionará si la cadena es blahJohnblah –

+1

@StewieGriffin ese es todo el punto, su respuesta es incorrecta – iConnor

0

Me gusta la solución de @lonesomeday, pero soy partidario de extender el String.prototype en estos escenarios. Aquí está mi adaptación de su solución

String.prototype.endsWith = function (needle) { 
    return needle === this.substr(0 - needle.length); 
} 

Así se puede comprobar con

if(myStr.endsWith("test")) // Do awesome things here. 

sabroso ...

-1

Aquí está una función prototipo cadena que utiliza expresiones regulares.Se puede utilizar para comprobar si cualquier objeto cadena termina con un valor de cadena en particular: la función

Prototipo:

String.prototype.endsWith = function (endString) { 
    if(this && this.length) { 
     result = new RegExp(endString + '$').test(this); 
     return result; 
    } 
    return false; 
} 

Ejemplo de Uso:

var s1 = "My String"; 
s1.endsWith("ring"); // returns true; 
s1.endsWith("deez"); //returns false; 
+1

Usted debería explicar por qué esto responde la pregunta. –

0

Si que lo necesite para reemplace la función, considere este regExp:

var eventStr = "Hello% World%"; 

eventStr = eventStr.replace(/[\%]$/, "").replace(/^[\%]/, ""); // replace eds with, and also start with %. 

// output: eventStr = "Hola% Mundo";

0
var id = "John"; 

(new RegExp(`${id}$`)).test('blahJohn'); // true 
(new RegExp(`${id}$`)).test('blahJohna'); // false 

`$ {id} $ 'es un JavaScript Template strings que será compilado para 'John $'.

El $ después de Juan en RegExp representa final de la cadena por lo que la cadena de prueba no debe tener nada después de valor de ID (es decir, John) con el fin de pasar la prueba.

nuevo RegExp (`$ {id} $`) - lo compilará en /John$/ (por lo que si id no debe ser dinámico puede usar simplemente/John $/en lugar del nuevo RegExp (`$ {id} $`))

+2

Gracias por este fragmento de código, que puede brindar alguna ayuda inmediata. Una explicación adecuada [mejoraría en gran medida] (https://meta.stackexchange.com/q/114762) su valor educativo al mostrar por qué esta es una buena solución al problema, y ​​lo haría más útil para futuros lectores con similares, pero no idénticas, preguntas. Edite su respuesta para agregar una explicación y dé una indicación de qué limitaciones y suposiciones se aplican. – GrumpyCrouton

+0

@GrumpyCrouton Genial, hecho :). Espero que la explicación que he agregado ayude a entender la solución. – Alexander