Aquí hay una expresión regular que funciona bien en la mayoría de las implementaciones de expresiones regulares:
(?<!filename)\.js$
Esto coincide con .js para una cadena que termina con .js excepto para filename.js
Javascript no tiene regex retrospectiva. ¿Alguien puede armar una expresión regular alternativa que logre el mismo resultado y funcione en javascript?
Aquí hay algunos pensamientos, pero necesita funciones de ayuda. Esperaba lograrlo solo con una expresión regular: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
javascript
regex
daniel
fuente
fuente
(?<=thingy)thingy
para mirar hacia atrás positivo y(?<!thingy)thingy
para mirar hacia atrás negativo . Ahora los apoya.Respuestas:
^(?!filename).+\.js
funciona para miprobado contra:
¿Se puede encontrar una explicación adecuada para esta expresión regular en Expresión regular para que coincida con la cadena que no contiene una palabra?
Look ahead está disponible desde la versión 1.5 de javascript y es compatible con todos los principales navegadores
Actualizado para coincidir con filename2.js y 2filename.js pero no filename.js
(^(?!filename\.js$).).+\.js
fuente
a.js
2filename.js
, pero la expresión regular dada aquí sí. Una más apropiada sería^(?!.*filename\.js$).*\.js$
. Esto significa, emparejar cualquiera*.js
excepto*filename.js
.EDITAR: desde ECMAScript 2018 en adelante, las aserciones retrospectivas (incluso ilimitadas) son compatibles de forma nativa .
En versiones anteriores, puedes hacer esto:
Esto hace explícitamente lo que la expresión de retrospectiva está haciendo implícitamente: verifique cada carácter de la cadena si la expresión de retrospectiva más la expresión regular después de que no coincida, y solo entonces permita que ese carácter coincida.
Otra edición:
Me duele decir (especialmente porque esta respuesta se ha votado tanto) que hay una manera mucho más fácil de lograr este objetivo. No hay necesidad de verificar la anticipación de cada personaje:
funciona igual de bien:
fuente
2filename.js
. Mi expresión regular coincide exactamente en los mismos casos que su ejemplo de expresión regular.^(?!.*filename\.js$).*\.js$
funcionaría. Tratando de pensar en situaciones en las que el grupo nc aún podría ser necesario ...Supongamos que desea encontrar todo lo que
int
no esté precedido porunsigned
:Con soporte para mirar hacia atrás negativo:
Sin soporte para la retrospectiva negativa:
Básicamente, la idea es tomar n caracteres anteriores y excluir la coincidencia con anticipación negativa, pero también coincide con los casos en los que no hay n caracteres anteriores. (donde n es la longitud de mirar hacia atrás).
Entonces la expresión regular en cuestión:
se traduciría a:
Es posible que deba jugar con grupos de captura para encontrar el lugar exacto de la cadena que le interesa o no desea reemplazar una parte específica con otra cosa.
fuente
(?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne))
a lo(?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne))
que hace el truco para mis necesidades. Simplemente proporcionando esto como otro escenario del "mundo real". Ver enlace((?!unsigned ).{9}|^.{0,8})int
Si puede mirar hacia adelante pero hacia atrás, puede invertir la cadena primero y luego mirar hacia adelante. Se necesitará más trabajo, por supuesto.
fuente
Esta es una solución equivalente a la respuesta de Tim Pietzcker (ver también comentarios de la misma respuesta):
Significa, partido
*.js
excepto*filename.js
.Para llegar a esta solución, puede verificar qué patrones excluye la mirada negativa hacia atrás y luego excluir exactamente estos patrones con una mirada negativa hacia adelante.
fuente
A continuación se muestra una alternativa positiva de JavaScript detrás que muestra cómo capturar el apellido de las personas con 'Michael' como primer nombre.
1) Dado este texto:
obtener una variedad de apellidos de personas llamadas Michael. El resultado debería ser:
["Jordan","Johnson","Green","Wood"]
2) Solución:
3) Verificar solución
Demostración aquí: http://codepen.io/PiotrBerebecki/pen/GjwRoo
También puedes probarlo ejecutando el fragmento a continuación.
fuente