2010-04-08 30 views
10

Digamos que usando Javascript, quiero hacer coincidir una cadena que termina con [abcde]* pero no con abc.Javascript regex para que coincida con una cadena que termina con algunos caracteres pero no con una combinación particular de esos

así, el texto debe coincidir con xxxa, xxxbc, xxxabd pero no xxxabc.

Estoy completamente confundido.

Editar: tengo que usar expresiones regulares, por alguna razón, no puedo hacer algo if (str.endsWith("abc"))

+0

En caso de '[abcde] *' 'realmente [abcde] +'? De lo contrario 'xxx' coincide perfectamente. – polygenelubricants

Respuesta

25

La solución es simple: utilizar búsqueda negativa hacia delante:

(?!.*abc$) 

Esta afirma que la cadena no termina con abc.

Mencionó que también necesita que la cadena termine con [abcde]*, pero * significa que es opcional, por lo que xxx coincide. Supongo que realmente quiere [abcde]+, que también significa que debe terminar con [abcde]. En ese caso, las afirmaciones son:

(?=.*[abcde]$)(?!.*abc$) 

Ver regular-expressions.info de tutoriales sobre lookarounds positivos y negativos.


yo era reacio a dar a la expresión regular real Javascript ya que no estoy familiarizado con el lenguaje (aunque estaba seguro de que las afirmaciones, si es compatible, trabajarían - según regular-expressions.info, Javascript apoya positivo y negativo mirar hacia el futuro).Gracias a puntiagudas y los comentarios de Alan Moore, yo creo la expresión regular correcta Javascript es la siguiente:

var regex = /^(?!.*abc$).*[abcde]$/; 

Tenga en cuenta que esta versión (con abono a Alan Moore) ya no necesita la búsqueda positiva hacia delante. Simplemente coincide con .*[abcde]$, pero primero afirmando ^(?!.*abc$).

+0

Eso no funciona. Pruébalo en Javascript: la segunda expresión regular coincide con "xxabc". – Pointy

+0

@Pointy: '" xxabc ".matches (" (? =. * [Abcde] $) (?!. * Abc $). * ")' Es 'falso' en Java; Admito que no estoy familiarizado con ningún sabor particular de JavaScript, pero si admite una búsqueda positiva y negativa, entonces la expresión regular debería funcionar. – polygenelubricants

+0

@Pointy: '" xxabc ".match (/^(? =. * [Abcde] $) (?!. * Abc $). * $ /)' Es 'null' en Javascript (aunque no estoy seguro si esta es la forma correcta de regex en este idioma). – polygenelubricants

0

Hmm ...

var regex = /(ab[abde]|[abcde])$/; // wrong 

tal vez? Espera no; aferrarse:

var regex = /(ab[abde]|([^a].|.[^b])[abcde]|\b.?[abcde])$/; 

Así que eso es "ab", seguido por "a", "b", "d", o "e"; o cualquier secuencia de dos caracteres donde el primer carácter no es "a" o el segundo carácter no es "b", seguido de "a" a "e"; o cualquier límite de palabra seguido de cualquier carácter (posiblemente) seguido de "a" a "e". La última cláusula es tratar con cadenas cortas; es una especie de trampa, pero en este caso funciona.

2

En primer lugar, la nota cada cadena termina con [abcde]*, ya que eso permite un ancho cero. Por lo tanto, solo estamos buscando una expresión regular que coincida con cadenas que no terminan en abc. Fácil.

([^c]|[^b]c|[^a]bc)$ 

eso es algo que no es c, algo que no está b seguido por c, o algo que no a está seguido por bc, y cualquiera que sea la opción de los que, a continuación, seguido por el final de la cadena.

15

O la pregunta no está bien definida, o todo el mundo pasa por alto una respuesta simple.

var re = /abc$/; 

!re.test("xxxa"); // pass 
!re.test("xxxbc"); // pass 
!re.test("xxxabd"); // pass 
!re.test("xxxabc"); // fail 

Todos estos fin en /[abcde]*/

+0

Simple, inteligente. Simplemente también prueba los últimos resultados char y 'y' booleanos. – Kangur

+0

Estoy de acuerdo, muy simple, pero para mi [caso de uso] (http://stackoverflow.com/a/26555116/1008999) no habría funcionado con '!' Al principio – Endless

1

sólo quiero decir a @ Maček que su respuesta es simple y claro con ! en el principio Pero realmente querían que el operador no estar dentro de la expresión regular por lo que podía utilizarlo con, por ejemplo: Array::some, Array::filter, Array::find, Array::findIndex y sin tener que crear una función o un bucle Wile

Aquí está un ejemplo:

var items = ["ja", "ka", "mf", "bg", "vb", "b"] 
 
var regex = /^((?!a$|b$).)*$/; // match a string that doesn't end with a or b 
 

 
var matched = items.filter(RegExp.prototype.test, regex); 
 

 
alert(matched); // result: ["mf", "bg"]

Cuestiones relacionadas