English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Afirmación de longitud cero de la expresión regular:
La afirmación de longitud cero es un punto difícil de las expresiones regulares, por lo que este capítulo se enfoca en el análisis del principio de coincidencia. La afirmación de longitud cero también tiene otros nombres, como "visión circular" o "búsqueda previa", etc., pero estos no son el punto de atención.
I. Conceptos básicos:
La afirmación de longitud cero, como su nombre lo indica, es una coincidencia de longitud cero, que no guarda el contenido coincidente en los resultados de la coincidencia, y el resultado final de la coincidencia es solo una posición.
El propósito es agregar una condición limitativa a la posición especificada, para que los caracteres antes o después de esta posición cumplan con la condición limitativa para que la expresión de carácter de la expresión regular coincida con éxito.
Nota: lo que se dice aquí sobre la subexpresión no es solo la expresión entre paréntesis, sino cualquier unidad de coincidencia de la expresión regular.
javascript solo admite afirmaciones de longitud cero avanzadas, y las afirmaciones de longitud cero avanzadas se pueden dividir en afirmaciones de longitud cero avanzadas positivas y negativas.
.Afirmación de ancho cero negativo:
Ejemplo de código uno:
ejemplo de código como follows:863ab ";/var reg=63;=[A-ab(/; g;
En el código anterior, el significado de la expresión regular es: coincidir con la cadena de caracteres "ab" que sigue cualquier letra mayúscula. El resultado de la coincidencia final es "ab", porque la afirmación de longitud cero "(?=[A-Z])" no coincide con ningún carácter, solo se utiliza para especificar que después de la posición actual debe seguir una letra mayúscula.
Ejemplo de código dos:
ejemplo de código como follows:863ab ";/var reg=63;![A-ab(/; g;
En el código anterior, el significado de la expresión regular es: coincidir con la cadena de caracteres "ab" que no sigue ninguna letra mayúscula. La expresión regular no coincide con ningún carácter, porque en la cadena, después de "ab" sigue una letra mayúscula.
II. Principio de coincidencia:
El código anterior solo introduce el principio de coincidencia de la afirmación de ancho cero.
a continuación, se presenta respectivamente en forma de principio de coincidencia cómo coinciden las afirmaciones de ancho cero positivo y negativo.
1.Afirmación de ancho cero positivo:
.Afirmación de ancho cero negativo:
var str="<div>antzone"; ";/^(?=<)<[^>]+>\w+/; g;
console.log(str.match(reg));
primero obtiene el control del "^" de la expresión regular, primero comienza a coincidir desde la posición 0, coincide con la posición de inicio 0, coincide con éxito, luego devuelve el control a "(?=<)", debido a que "^" es de ancho cero, por lo que "(?=<)", debido a que "^" es de ancho cero, por lo que "(?=<)"también comienza a coincidir desde la posición 0, requiere que la posición a la derecha sea el carácter "<", el carácter a la derecha de la posición 0 es exactamente el carácter "<", coincide con éxito, luego devuelve el control al carácter "<", debido a "(
2;=<)"también es de ancho cero, por lo que también comienza a coincidir desde la posición 0, por lo que la coincidencia es exitosa, no se describe aquí el proceso de coincidencia posterior.
.Afirmación de ancho cero negativo:
ejemplo de código como follows:863var str="abZW88ab ";/var reg=63;![A-ab(/Z]) g;
console.log(str.match(reg));
el proceso de coincidencia es el siguiente:1primero obtiene el control del carácter "a" de la expresión regular, comienza a coincidir desde la posición 0, coincide con el carácter "a" con éxito, luego devuelve el control al carácter "b", desde la posición63;![A-Z])", comenzando desde la posición2comienza a coincidir, coincide con el carácter "b" con éxito, luego devuelve el control a "(comienza a coincidir, requiere que la posición a la derecha no sea cualquier letra mayúscula, y la posición a la derecha es la letra mayúscula "Z", falla la coincidencia, luego devuelve el control al carácter "a", y desde la posición2comienza a intentar coincidir, falla, luego devuelve el control al carácter "a", desde la posición7comienza a intentar coincidir desde la posición, luego devuelve el control a "b", luego desde la posición8comienza a intentar coincidir desde la posición, coincidencia exitosa, luego devuelve el control a "(?![A-Z])", comenzando desde la posición9comienza a intentar coincidir desde la posición, estableciendo que la posición a la derecha no puede ser una letra mayúscula, coincidencia exitosa, pero no coincidirá realmente con los caracteres, por lo que el resultado de la coincidencia final es "ab".
A continuación, se añade
La afirmación de ancho cero es un método de expresión regular, y la expresión regular en la ciencia de la computación es una cadena de caracteres que se utiliza para describir o coincidir una serie de cadenas de caracteres que cumplen con ciertas reglas sintácticas.
Definición e interpretación
La afirmación de ancho cero es un método de expresión regular
La expresión regular en la ciencia de la computación es una cadena de caracteres que se utiliza para describir o coincidir una serie de cadenas de caracteres que cumplen con ciertas reglas sintácticas. En muchos editores de texto u otros herramientas, la expresión regular se utiliza generalmente para buscar y/o reemplazar los contenido de texto que coinciden con un cierto patrón. Muchos lenguajes de programación soportan utilizar expresiones regulares para operaciones de cadenas. Por ejemplo, en Perl se ha integrado un motor de expresiones regulares potente. El concepto de expresión regular se popularizó originalmente por herramientas de software en Unix (por ejemplo, sed y grep). Las expresiones regulares se abrevian generalmente como “regex”, singular tiene regexp, regex, plural tiene regexps, regexes, regexen.
Afirmación de ancho cero
Se utiliza para buscar cosas antes o después de ciertos contenido (pero no incluye estos contenido), es decir, se utilizan como \b, ^, $ para especificar una posición, que debe cumplir ciertas condiciones (es decir, afirmaciones), por lo que también se conocen como afirmaciones de ancho cero. Es mejor explicar con ejemplos: La afirmación se utiliza para declarar un hecho que debe ser verdadero. En expresiones regulares, solo se continuará el proceso de coincidencia cuando la afirmación sea verdadera.
(?=exp) también se llama afirmación de ancho cero positiva de predicción, que afirma que la posición posterior puede coincidir con la expresión exp. Por ejemplo, \b(?=re)\w+\b, coincidirá con la parte posterior de la palabra que comienza con re (excepto re), como al buscar reading a book., se coincidirá con ading.
var reg = new Regex(@"\w+(?=ing)"); var str = "muing"; Console.WriteLine(reg.Match(str).Value);//Regresó mu
(?<=exp) también se llama afirmación de ancho cero positiva de retroalimentación, que afirma que la posición anterior puede coincidir con la expresión exp. Por ejemplo, \b\w+(?<=ing\b) coincidirá con la parte anterior de la palabra que termina en ing (excepto ing), por ejemplo, al buscar I am reading., se coincidirá con read.
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?=\d)\d{3})+\b, usándolo para1234567890 al buscar los resultados son234567890。
El siguiente ejemplo utiliza ambos tipos de clausuras: (?<=\s)\d+(?=\s) Coincide con el número separado por espacios en blanco (de nuevo, no incluye estos espacios en blanco).
Afirmación de ancho cero negativa
Anteriormente mencionamos cómo encontrar caracteres que no son ciertos o no están en ciertas clases de caracteres (opuesto). Pero ¿qué pasa si solo queremos asegurarnos de que un carácter no aparece, pero no queremos coincidir con él? Por ejemplo, si queremos buscar palabras como--Dentro de él hay una letra q, pero después de q no sigue una letra u, podemos intentar hacer lo siguiente:
\b\w*q[^u]\w*\b coincidirá con la palabra que contiene un q después de que no sea la letra u. Pero si haces más pruebas (o si tienes una mente suficientemente aguda, puedes observar directamente), descubrirás que si el q aparece al final de una palabra, como Iraq, Benq, esta expresión fallará. Esto se debe a que [^u] siempre debe coincidir con un carácter, por lo que si q es el último carácter de una palabra, el [^u] siguiente coincidirá con el separador de palabras después de q (puede ser un espacio, un punto o algo más), el siguiente \w*\b coincidirá con la próxima palabra, por lo que \b\w*q[^u]\w*Puede coincidir con todo el Iraq fighting. La afirmación de ancho cero negativa puede resolver este problema, porque solo coincide con una posición, sin consumir ningún carácter. Ahora, podemos resolver este problema de la siguiente manera: \b\w*q(?!u)\w*\b).
Afirmación prospectiva de anclaje de cero anchura negativa (?!exp), afirma que la posición posterior no puede coincidir con la expresión exp. Por ejemplo: \d{3})(?!\d)Coincide con un número de tres dígitos, y estos tres dígitos no pueden ser seguidos por un número;\b((?!abc)\w)+\bCoincide con una palabra que no contiene la cadena continua 'abc'.
Del mismo modo, podemos usar (?<!exp), afirmación prospectiva de anclaje de cero anchura negativa para afirmar que la posición anterior no puede coincidir con la expresión exp: (?<![a-z])\d{7}Coincide con un número de siete dígitos que no comienza con una letra minúscula.
Un ejemplo más complejo: (?<=<(\w+)>).*(?=<\/\1>), coincide con el contenido dentro de una etiqueta HTML simple sin atributos. (<?=(\w+)>) especifica tal prefijo: una palabra entre corchetes angulares (por ejemplo, podría ser <b>), seguido de .*(cualquier cadena), seguido de un sufijo (?=<\/\1>). Tenga en cuenta que el \/utiliza la escapada de caracteres mencionada anteriormente;\1es una referencia inversa, que hace referencia al primer grupo capturado, la parte anterior (\w+) del contenido, de modo que si el prefijo es realmente <b>, el sufijo es </b> y <. Todo el patrón coincide con <b> y </b> entre el contenido (de nuevo, sin incluir el prefijo y el sufijo en sí mismos).
Las anteriores han sido un poco difíciles de entender. Vamos a complementar con un poco más:
Las afirmaciones se utilizan para declarar un hecho que debe ser verdadero. En las expresiones regulares, solo se continuará el ajuste cuando la afirmación sea verdadera.
Las siguientes cuatro se utilizan para buscar algo antes o después de ciertos contenidos (pero no incluyen estos contenidos), es decir, al igual que \b, ^, $ se utilizan para especificar una posición, que debe cumplir ciertas condiciones (es decir, afirmaciones), por lo que también se conocen como afirmaciones de anclaje de cero anchura. Mejor es explicar con ejemplos:
(?=exp) también se llama afirmación prospectiva de anclaje de cero anchura, afirma que la posición posterior puede coincidir con la expresión exp. Por ejemplo \b\w+(?=ing\b),Coincide con la parte anterior de una palabra que termina en 'ing' (excepto 'ing' en sí mismo), por ejemplo, al buscar 'I'm singing while you're dancing.', coincide con 'sing' y 'danc'.
(?<=exp) también se llama afirmación prospectiva de anclaje de cero anchura, afirma que la posición anterior puede coincidir con la expresión exp. Por ejemplo (?<=\bre)\w+Coincide con la parte posterior de una palabra que comienza con 're' (excepto 're' en sí mismo), por ejemplo, al buscar 'reading a book', coincide con 'ading'.
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\b, usándolo para1234567890 al buscar los resultados son234567890。
El siguiente ejemplo utiliza ambos tipos de clausuras: (?<=\s)\d+(?=\s) Coincide con el número separado por espacios en blanco (de nuevo, no incluye estos espacios en blanco).
Suplemento dos:
Recientemente, para procesar el código fuente de archivos html, se necesitó realizar búsquedas y reemplazos regulares. Utilizando esta oportunidad, aprendí sistemáticamente las expresiones regulares, aunque ya había utilizado expresiones regulares anteriormente, siempre fue aprenderlas de manera temporal para pasar. En el proceso de aprendizaje, me encontré con muchos problemas, especialmente las clausuras de predicción anticipada de cero ancho (aquí también quiero quejarme, hay mucho contenido copiado y pegado en línea, al encontrar un problema, he visto muchas cosas repetidas, ¡sudor!!!), por lo que aquí escribo mi comprensión para facilitar su consulta en el futuro!
¿Qué es la clausura de predicción anticipada de cero ancho? Vea la explicación y definición oficial en msdn
(?= Expresión)
(Clausura de predicción anticipada de cero ancho。)Sólo se continúa la coincidencia cuando la subexpresión en esta posición coincide a la derecha. Por ejemplo, \w+(?=\d) Coincide con la palabra que sigue a un número, pero no con el número en sí.
Ejemplo clásico: obtener el contenido antes de una palabra que termina en ing
var reg = new Regex(@"\w+(?=ing)"); var str = "muing"; Console.WriteLine(reg.Match(str).Value);//Regresó mu
Los ejemplos que se pueden ver en cualquier lugar de la red, aquí tal vez ya entendiste, es que regresó el contenido antes de la expresión exp.
Vamos a ver el siguiente código
var reg = new Regex(@"a(?=b)c"); var str = "abc"; Console.WriteLine(reg.IsMatch(str));//Regresó false
¿Por qué regresó false?
En realidad, la definición oficial de msdn ya lo ha dicho, solo que lo dice de manera oficial. Aquí debemos prestar atención a un punto clave: esta posición. No, es una posición y no un carácter. Entonces, combinando la definición oficial y el primer ejemplo para entender el segundo ejemplo:
Porque después de a viene b, se regresó el contenido de coincidencia a (sabiendo por el primer ejemplo, solo regresamos a y no el contenido de coincidencia de exp), en este momento a(?=b)c63La parte =b) ya se ha resuelto, ahora debemos resolver el problema de la coincidencia de c, ¿dónde comienza la coincidencia de c en la cadena abc? Combinando la definición oficial, sabemos que comienza desde la posición del subexpresión hacia la derecha, por lo que es desde la posición b, pero b no coincide con a(?=b)c el c restante, por lo que abc no coincide con a(?=b)c terminado.
Entonces, ¿cómo debe escribirse el patrón regular para que coincida con lo anterior?
La respuesta es: a(?=b)bc
Claro, alguien dirá que directamente abc coincide, ¿por qué hacer tanto trabajo? Claro, no es necesario hacer tanto trabajo, solo para explicar cómo es la afirmación de predicción positiva de cero ancho. ¡El principio de otras afirmaciones de cero ancho es el mismo!
Suplemento tres
(?=exp): afirmación de predicción positiva de cero ancho, asegura que la posición posterior pueda coincidir con la expresión exp.
#Coincide con el siguiente es _path, el resultado es product
'product_path'.scan /(product)(?=_path)/
(?<=exp): afirmación de retroalimentación positiva de cero ancho, asegura que la posición anterior pueda coincidir con la expresión exp
#Coincide con el anterior es name: y el resultado es wangfei
'name:wangfei'.scan /(?<=name:)(wangfei)/ #wangfei
(?!exp): afirmación de predicción positiva de cero ancho, asegura que la posición posterior no coincida con la expresión exp.
#Coincide con el siguiente no es _path
'product_path'.scan /(product)(?!_path)/ #nil
#Coincide con el siguiente no es _url
'product_path'.scan /(product)(?!_url)/ #product
(?<!exp): afirmación de retroalimentación negativa de cero ancho para asegurar que la posición anterior no coincida con la expresión exp
#Coincide con el anterior no es name:
'name:angelica'.scan /(?<!name:)(angelica)/ #nil
#Coincide con el anterior no es nick_name:
'name:angelica'.scan /(?<!nick_name:)(angelica)/#angelica
El editor también está harto de esto, esperará a que haya algo bueno para compartir, hoy se lavará y se dormirá