Necesito una expresión regular capaz de coincidir con todo menos una cadena que comience con un patrón específico (específicamente index.php
y lo que sigue, como index.php?id=2342343
)
Necesito una expresión regular capaz de coincidir con todo menos una cadena que comience con un patrón específico (específicamente index.php
y lo que sigue, como index.php?id=2342343
)
Respuestas:
No es un experto en expresiones regulares, pero creo que podría usar una búsqueda negativa desde el principio, por ejemplo ^(?!foo).*$
, no debería coincidir con nada que comience desde el principio foo
.
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )
Regex: coincide con todo menos :
foo
):
world.
al final):
foo
) (sin patern compatible con POSIX, lo siento):
|
símbolo)
foo
):
cat
): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
o/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
(cat)|[^c]*(?:c(?!at)[^c]*)*
(o (?s)(cat)|(?:(?!cat).)*
, o (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
) y luego verificar con el idioma significa: si el Grupo 1 coincide, no es lo que necesitamos, de lo contrario, tome el valor de coincidencia si no está vacío[^a-z]+
(cualquier carácter que no sea una letra ASCII en minúsculas)|
:[^|]+
Nota de demostración : la nueva línea \n
se usa dentro de las clases de caracteres negadas en las demostraciones para evitar el desbordamiento de coincidencias a las líneas vecinas. No son necesarios al probar cadenas individuales.
Nota de anclaje : en muchos idiomas, use \A
para definir el inicio inequívoco de la cadena y \z
(en Python \Z
, en JavaScript, $
está bien) definir el final de la cadena.
Nota de puntos : en muchos sabores (pero no en POSIX, TRE, TCL), .
coincide con cualquier carácter excepto un carácter de nueva línea . Asegúrese de utilizar el modificador DOTALL correspondiente ( /s
en PCRE / Boost / .NET / Python / Java y /m
en Ruby) para .
que coincida con cualquier carácter, incluida una nueva línea.
Nota de barra invertida : en los lenguajes donde tiene que declarar patrones con cadenas C que permiten secuencias de escape (como \n
para una nueva línea), debe duplicar las barras invertidas que escapan caracteres especiales para que el motor pueda tratarlos como caracteres literales (por ejemplo, en Java, world\.
será declarado como "world\\."
, o use una clase de caracteres:) "world[.]"
. Utilice literales de cadena sin formato (Python r'\bworld\b'
), literales de cadena textuales de C # @"world\."
o anotaciones literales de cadena / regex /world\./
.
^(?!foo$)
, ¿por qué el signo de dólar debe estar entre paréntesis para que la expresión funcione? Esperaba ^(?!foo)$
dar los mismos resultados, pero no es así.
$
ancla está dentro de la búsqueda anticipada, es parte de la condición, parte de esa afirmación de ancho cero . Si estuviera afuera, como adentro ^(?!foo)$
, será parte del patrón de consumo que requiere el final de la cadena justo después del inicio de la cadena, lo que hace que la búsqueda anticipada negativa sea irrelevante ya que siempre devolverá verdadero (no puede haber ningún texto después del final de la cadena) , mucho menos foo
). Entonces, ^(?!foo$)
coincide con el inicio de una cadena que no se sigue con la foo
que se sigue con el final de la cadena. ^(?!foo)$
coincide con una cadena vacía.
cot
o lan
, y eliminar la coincidencia, como regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
.
Puede poner un ^
al comienzo de un conjunto de caracteres para que coincida con cualquier cosa que no sean esos caracteres.
[^=]*
coincidirá con todo menos =
Simplemente coincida y /^index\.php/
luego rechace lo que coincida.
str !~ /\Aindex\.php/
.
Necesito un poder expresión regular para que coincida con todo , pero excepto una cadena que comienza con
index.php
un patrón específico (en concreto index.php y lo que sigue, como index.php? Id = 2342343)
Utilice el método Exec
let match,
arr = [],
myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
while ((match = myRe.exec(str)) != null) {
arr.push(match[1]);
}
console.log(arr);
var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);
U otro partido
let match,
arr = [],
myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;
var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';
while ((match = myRe.exec(str)) != null) {
arr.push(match[1]);
}
console.log(arr);
¿Qué tal no usar regex:
// In PHP
0 !== strpos($string, 'index.php')
grep
en la línea de comandos, por ejemplo, o Perl / Python / cualquier otro idioma, o un comando "Ejecutar esta expresión regular para cada línea" en un editor de texto, etc.)