Entenderás qué es una expresión regular en 30 minutos y tendrás una comprensión básica de ella, lo que te permitirá usarla en tus propios programas o páginas web.
Tutorial de introducción a las expresiones regulares en 30 minutos. Objetivo del artículo Cómo utilizar este tutorial ¿Qué es exactamente una expresión regular? Introducción Probar expresiones regulares carácter especial Escape de caracteres Repetir clase de caracteres Condiciones de ramificación Grupo antónimo Referencia posterior Afirmación de ancho cero afirmación de ancho cero negativa Comentario Avaricia y pereza. Opciones de manejo Grupo equilibrado / Coincidencia recursiva ¿Qué más hay que no se ha mencionado? Contactar al autor Recursos en línea y referencias de este artículo.
No te dejes intimidar por las expresiones complejas que verás a continuación. Solo sigue mis pasos y te darás cuenta de que las expresiones regulares no son tan difíciles como imaginas. Por supuesto, si después de leer este tutorial te das cuenta de que has entendido mucho, pero apenas recuerdas algo, eso es completamente normal. Creo que la probabilidad de que alguien que nunca ha trabajado con expresiones regulares recuerde más del 80% de la sintaxis mencionada en este tutorial es prácticamente cero. Aquí solo te ayudaré a comprender los principios básicos; necesitarás practicar y usar más para dominar las expresiones regulares.
Lo más importante es — por favor, dame. 30 minutos Si no tienes experiencia en el uso de expresiones regulares, no intentes hacerlo en 30. segundo Puerta de entrada: a menos que seas Superman :)
Además de servir como un tutorial introductorio, este artículo también intenta ser un manual de referencia sobre la sintaxis de expresiones regulares que se puede utilizar en el trabajo diario. En cuanto a la experiencia del autor, este objetivo se ha cumplido bastante bien: como puedes ver, yo mismo no he logrado recordar todo, ¿verdad?
Eliminar formato Convención de formato de texto: términos técnicos Caracteres especiales/formato de sintaxis Expresión regular Una parte de la expresión regular (para análisis) Cadena de origen a la que se le está haciendo coincidir. Explicación de expresiones regulares o de alguna de sus partes. 。
Notas al margen ocultas A la derecha de este texto hay algunos comentarios, que sirven principalmente para proporcionar información relevante o explicar conceptos básicos a los lectores sin formación en programación; normalmente se pueden ignorar.
Al escribir programas o páginas web que procesan cadenas, a menudo surge la necesidad de buscar cadenas que cumplan con ciertas reglas complejas. Expresión regular Es una herramienta utilizada para describir estas reglas. En otras palabras, una expresión regular es un código que registra las reglas del texto.
Es muy probable que hayas utilizado la herramienta de búsqueda de archivos en Windows/Dos.
comodín
wildcard
)
es decir
*
y
?
Si quieres buscar todos los documentos de Word en un directorio, buscarías.
*
.doc
Aquí,
*
se puede interpretar como cualquier cadena. Al igual que los comodines, las expresiones regulares son herramientas utilizadas para la coincidencia de texto, pero a diferencia de los comodines, pueden describir tus necesidades de manera más precisa; por supuesto, el costo es que son más complejas. Por ejemplo, puedes escribir una expresión regular para buscar.
Cualquier cadena que comience con 0, seguida de 2 a 3 dígitos, luego un guion "-" y finalmente 7 u 8 dígitos.
(como)
010-12345678
o
0376-7654321
)。
carácter Es la unidad más básica en el procesamiento de texto por software de computadora, que puede ser una letra, un número, un signo de puntuación, un espacio, un salto de línea, un carácter chino, etc. cadena Es una secuencia de 0 o más caracteres. Texto Es decir, texto, cadena de caracteres. Hablar de una determinada cadena. Coincidencia Una expresión regular se refiere generalmente a que en una cadena de texto hay una o varias partes que cumplen con las condiciones establecidas por la expresión.
La mejor manera de aprender expresiones regulares es comenzar con ejemplos, entenderlos y luego modificarlos y experimentar por tu cuenta. A continuación se presentan varios ejemplos simples, junto con explicaciones detalladas.
Supongamos que estás buscando en una novela en inglés. hi Puedes usar expresiones regulares. hi 。
Esta es casi la expresión regular más simple, que puede coincidir exactamente con cadenas como: Compuesto por dos caracteres, el primero es h y el segundo es i. Normalmente, las herramientas que manejan expresiones regulares ofrecen una opción de ignorar mayúsculas y minúsculas; si se selecciona esta opción, puede coincidir. hi , HI , Hi , hI Cualquiera de estas cuatro situaciones.
Desafortunadamente, muchas palabras contienen. hi Estos dos caracteres consecutivos, como him , history , high Espera. Usa hi Para buscar, aquí dentro. hi También será encontrado. Si es necesario... Buscar exactamente la palabra "hi". Deberíamos usar. \bhi\b 。
\b
Es un código especial definido por las expresiones regulares (bueno, algunas personas lo llaman).
caracteres especiales,
metacharacter
representa a
El principio o el final de una palabra, es decir, el límite de la palabra.
Aunque normalmente las palabras en inglés están separadas por espacios, signos de puntuación o saltos de línea, sin embargo
\b
no coincide con ninguno de los caracteres de separación de estas palabras, él/ella
Solo coincidir en una posición.
。
Si lo que buscas es Detrás de hi, hay una Lucy. deberías usar \bhi\b.*\bLucy\b 。
si se necesita una expresión más precisa, \b Coincidir con una posición así: su carácter anterior y su carácter posterior no son todos (uno es, uno no lo es o no existe). \w 。
Aquí, el punto (.) es otro metacaracter que coincide con. Cualquier carácter excepto el salto de línea. .*Igualmente es un metacaracter, pero lo que representa no es un carácter, ni una posición, sino una cantidad: especifica * El contenido anterior se puede repetir de forma continua tantas veces como sea necesario para que toda la expresión coincida. Por lo tanto, * Unido significa cualquier cantidad de caracteres sin saltos de línea. Ahora. \bhi\b. * \bLucy\b El significado es muy claro: hi Lucy 。
Si usamos otros metacaracteres al mismo tiempo, podremos construir expresiones regulares más potentes. Por ejemplo, el siguiente caso:
0\d\d-\d\d\d\d\d\d\d\d Coincidir con una cadena como esta: Comienza con 0, seguido de dos dígitos, luego un guion "-" y finalmente 8 dígitos. (Es decir, el número de teléfono en China. Por supuesto, este ejemplo solo puede coincidir con el caso de un código de área de 3 dígitos).
换行符就是'\n',ASCII编码为10(十六进制
0x0A
) carácter.
aquí \d Es un nuevo metacaracter que coincide. Un dígito (0, o 1, o 2, o……) No es un metacaracter, solo coincide con sí mismo: el guion (o signo menos, o raya, o como quieras llamarlo).
Para evitar tantas repeticiones molestas, también podemos escribir esta expresión así: 0\d{2}-\d{8} Aquí. \d 后面的{ 2 }({ 8 }) significa "delante". \d Debe coincidir de manera continua 2 veces (8 veces). 。
Si no consideras que las expresiones regulares son difíciles de leer y escribir, o eres un genio, o no eres de este planeta. La sintaxis de las expresiones regulares es muy frustrante, incluso para quienes las usan con frecuencia. Debido a su dificultad para ser leídas y escritas, y a la facilidad con la que se cometen errores, es muy necesario encontrar una herramienta para probar expresiones regulares.
Otras herramientas de prueba disponibles:
Algunos detalles de las expresiones regulares son diferentes en distintos entornos. Este tutorial presenta el comportamiento de las expresiones regulares en el marco de trabajo .Net de Microsoft 4.0, por lo que te recomiendo la herramienta que he desarrollado para .Net. Probador de expresiones regulares Por favor, consulta las instrucciones de esta página para instalar y ejecutar el software.
A continuación se muestra una captura de pantalla del funcionamiento del Regex Tester:
Ahora ya conoces algunos caracteres especiales muy útiles, como \b , . , * , además \d En las expresiones regulares hay más metacaracteres, como \s Coincidencia Cualquier carácter en blanco, incluidos espacios, tabulaciones (Tab), saltos de línea, espacios en blanco de ancho completo en chino, etc. 。 \w Coincidencia letras, números, guiones bajos o caracteres chinos, etc. 。
A continuación, veamos más ejemplos:
\ba\w * \b Coincidencia con letras a La palabra inicial——primero en la posición de una palabra. \b ), luego vienen las letras. a , luego una cantidad arbitraria de letras o números ( \w * ), finalmente en la parte final de la palabra ( \b )。
El tratamiento especial de los caracteres chinos / 汉字 es soportado por el motor de expresiones regulares proporcionado por .Net. Para detalles sobre otras plataformas, consulte la documentación relevante.
Está bien, hablemos del significado de las palabras en las expresiones regulares: se refiere a una o más secuencias continuas de \w. Ciertamente, esto no tiene mucho que ver con los miles de términos homónimos que hay que memorizar al aprender inglés :)
\d+ Coincidencia 1 o más dígitos consecutivos Aquí. + es y * Caracteres meta similares, pero diferentes son. * Coincidir repetidamente (posiblemente 0 veces), y + coincide Repetir una o más veces. 。
\b\w{6}\b Coincidencia Palabra de exactamente 6 caracteres. 。
Código | Explicación |
---|---|
. | Coincidir cualquier carácter excepto el salto de línea. |
\w | Coincidir con letras, números, guiones bajos o caracteres chinos. |
\s | Coincidir con cualquier espacio en blanco. |
\d | Coincidir números |
\b | Coincidir con el inicio o el final de una palabra. |
^ | Coincidencia del inicio de la cadena. |
$ | Coincidencia del final de la cadena. |
carácter especial ^ y $ Todos coinciden en una posición, esto y \b Es un poco similar. ^ Coincidir con el comienzo de la cadena que deseas buscar, $ Coincidencia de final. Estos dos códigos son muy útiles para validar el contenido de entrada, por ejemplo, si un sitio web requiere que el número de QQ que ingreses tenga entre 5 y 12 dígitos, se puede usar: ^\d{5,12}$ 。
Aquí está { 5,12 } y { que se mencionó anteriormente. 2 } es similar, solo que { 2 } coincidencia Solo se puede repetir exactamente dos veces. ,{ 5,12 } entonces es El número de repeticiones no puede ser menor de 5 ni mayor de 12. de lo contrario, no coinciden.
Los motores de expresiones regulares suelen ofrecer un método para "probar si una cadena específica coincide con una expresión regular", como en JavaScript.
RegExp.test()
el método Regex.IsMatch() en .NET. Aquí, la coincidencia se refiere a si hay una parte de la cadena que cumple con las reglas de la expresión. Si no se utiliza... ^ y $ la palabra, para \d{5,12} En este sentido, utilizar este método solo garantiza que la cadena contenga. números consecutivos del 5 al 12 y no toda la cadena son solo de 5 a 12 dígitos.
Porque se utilizó ^ y $ Por lo tanto, toda la cadena de entrada debe ser utilizada para comparar. \d{5,12} Ven a emparejar, es decir, toda la entrada debe ser. de 5 a 12 dígitos Por lo tanto, si el número QQ ingresado coincide con esta expresión regular, entonces cumple con los requisitos.
y si se selecciona esta opción, ^ y $ el significado se convierte en Coincidencia al inicio y al final de la línea. 。
Si deseas buscar los metacaracteres en sí, como por ejemplo ., o *, surgirán problemas: no puedes especificarlos porque se interpretarán con otro significado. En este caso, debes usar \ para cancelar el significado especial de estos caracteres. Por lo tanto, deberías usar . y \ * Claro, para buscar \ en sí mismo, también debes usar. \ \ .
Por ejemplo:
unibetter
\
.com
Coincidencia
unibetter.com
,
>C:
\
Windows
Coincidencia
C:\Windows
。
Ya has visto lo anterior. * , + , {2} , {2,5} Estas son todas las cuantificadores en expresiones regulares (código que especifica la cantidad, como *, {5,12}, etc.):
código/sintaxis | Explicación |
---|---|
* | repetir cero o más veces |
+ | Repetir una o más veces. |
? | repetir cero o una vez |
{n} | repetir n veces |
{n,} | repetir n veces o más |
{m,m} | Repetir de n a m veces. |
A continuación se presentan algunos ejemplos de uso repetido:
Windows\d+ Coincidencia Windows seguido de uno o más números.
^\w+ Coincidencia La primera palabra de una línea (o la primera palabra de toda la cadena, dependiendo de la configuración de la opción).
Buscar números, letras o caracteres en blanco es muy sencillo, ya que ya existen los correspondientes a estos caracteres. * * el metacaracter, pero si deseas coincidir con caracteres que no son metacaracteres predefinidos. * * (Por ejemplo, las vocales a, e, i, o, u), ¿qué se debería hacer?
[Es muy simple, solo necesitas enumerarlos entre corchetes, como] [aeiou] solo coincidencia cualquier vocal en inglés , [.?!] Coincidencia Signos de puntuación (. o ? o !) 。
También podemos especificar un carácter fácilmente. Rango como [0-9] El significado de representar y \d es completamente igual: Un número Del mismo modo. [a-z0-9A-Z_] también es completamente equivalente a \w (Si solo consideramos el inglés).
A continuación, se presenta una expresión más compleja: \ (?0\d{2}[) -]?\d{8} 。
Esta expresión puede coincidir. Varios formatos de números de teléfono. como (010)88886666 o 022-22334455 o 02912345678 Esperemos. Vamos a hacer un análisis: primero, un carácter de escape. \ ( puede aparecer 0 o 1 vez ( ? ), luego es un 0 , seguido de 2 números ( \d{2} ), luego es ) o - o espacio uno de ellos, aparece una vez o no aparece. ? ), al final son 8 dígitos( \d{8} )。
“(” y “)” también son caracteres especiales, lo que sigue. Grupo de festivales Se mencionará en la reunión, por lo que aquí es necesario utilizar. escape 。
Desafortunadamente, la expresión anterior también puede coincidir. 010)12345678 o (022-87654321 Este formato "incorrecto". Para resolver este problema, necesitamos utilizar Condiciones de ramificación En expresiones regulares. Condiciones de ramificación Se refiere a varias reglas; si se cumple cualquiera de estas reglas, se debe considerar como un emparejamiento. El método específico es usar | para separar las diferentes reglas. ¿No lo entiendes? No te preocupes, mira el ejemplo:
0\d{2}-\d{8}|0\d{3}-\d{7} Esta expresión puede Coincidir con dos tipos de números de teléfono separados por un guion: uno es un código de área de tres dígitos y un número local de ocho dígitos (como 010-12345678), y el otro es un código de área de cuatro dígitos y un número local de siete dígitos (0376-2233445). 。
\ (0\d{2} ) [- ]?\d{8}|0\d{2}[- ]?\d{8} Esta expresión Coincidir con números de teléfono de 3 dígitos de código de área, donde el código de área puede estar entre paréntesis o no, y puede haber un guion o un espacio entre el código de área y el número local, o no puede haber separación. Puedes intentar expandir esta expresión utilizando condiciones ramificadas para que también soporte códigos de área de 4 dígitos.
\ d{5}-\d{4}|\d{5} Esta expresión se utiliza para coincidir con los códigos postales de Estados Unidos. La regla de los códigos postales en EE. UU. es que constan de 5 dígitos, o 9 dígitos separados por un guion. La razón por la que se da este ejemplo es porque puede ilustrar un problema: Al utilizar condiciones ramificadas, es importante prestar atención al orden de cada condición. Si lo cambias a \ d{5}|\d{5}-\d{4} En este caso, solo se emparejará el código postal de 5 dígitos (así como los primeros 5 dígitos del código postal de 9 dígitos). La razón es que al comprobar las condiciones de ramificación, se evaluarán cada una de ellas de izquierda a derecha, y si se cumple alguna de las ramificaciones, no se tendrán en cuenta las demás condiciones.
Ya hemos mencionado cómo repetir un solo carácter (solo hay que agregar un modificador después del carácter); pero, ¿qué hacer si quieres repetir varios caracteres? Puedes usar paréntesis para especificar. subexpresión (también llamado) Grupo ), luego puedes especificar el número de repeticiones de esta subexpresión, y también puedes realizar otras operaciones sobre la subexpresión (se presentarán más adelante).
(\d{1,3}
.
){3}\d{1,3}
Es algo simple.
IP
Coincidencia de direcciones
Expresión. Para entender esta expresión, analízala en el siguiente orden:
\d{1,3}
Coincidir con números de 1 a 3 dígitos.
,
(\d{1,3}
\
.){3}
Coincidencia
tres dígitos más un punto en inglés (esto en conjunto es esto)
Grupo
) Repetir 3 veces
y al final añadir.
Un número de uno a tres dígitos.
\
d{1,3}
)
。
Desafortunadamente, también coincidirá.
256.300.888.999
Esta dirección IP que no puede existir. Si se pudiera utilizar la comparación aritmética, quizás se podría resolver este problema de manera sencilla, pero las expresiones regulares no ofrecen ninguna función matemática, por lo que solo se pueden utilizar grupos, selecciones y clases de caracteres extensos para describir una correcta.
IP
Dirección:
((2[0-4]\d|25[0-5]|[01]?\d\d?)
\
.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
。
En una dirección IP, cada número no puede ser mayor que 255. No dejen que los guionistas de la tercera temporada de "24" los engañen...
La clave para entender esta expresión es comprender. 2[0-4]\d|25[0-5]|[01]?\d\d? No entraré en detalles aquí, deberías poder analizar su significado por ti mismo.
A veces es necesario buscar caracteres que no pertenecen a una clase de caracteres que se pueda definir fácilmente. Por ejemplo, si se quiere buscar cualquier carácter que no sea un número, se necesita usar antónimo :
código/sintaxis | Explicación |
---|---|
\W | Coincidir con cualquier carácter que no sea letra, número, guion bajo o carácter chino. |
\S | Coincidir con cualquier carácter que no sea un espacio en blanco. |
\D | Coincidir con cualquier carácter que no sea un dígito. |
\B | Coincidencia que no está al principio o al final de una palabra. |
[^x] | Coincidir cualquier carácter excepto x. |
[^aeiou] | Coincidir con cualquier carácter excepto las letras a, e, i, o, u. |
Ejemplo: \S+ Coincidir cadenas que no contengan espacios en blanco.
<a[^> ] +> Coincidir cadenas que comienzan con 'a' y están entre signos de menor y mayor.
después de usar paréntesis para especificar una subexpresión, Coincidir con el texto de esta subexpresión. (Es decir, el contenido capturado por este grupo) se puede procesar más adelante en expresiones u otros programas. Por defecto, cada grupo tendrá automáticamente un Número de grupo La regla es: de izquierda a derecha, utilizando el paréntesis de apertura del grupo como indicador, el primer grupo que aparece se numera como 1, el segundo como 2, y así sucesivamente.
Referencia posterior Utilizado para buscar de nuevo el texto que coincide con un grupo anterior. Por ejemplo, \1 representante Texto coincidente del grupo 1 ¿Difícil de entender? Por favor, mira el ejemplo:
\b(\w+)\b\s+\1\b se puede usar para coincidir con palabras repetidas, como go go o kitty kitty Esta expresión primero es Una palabra es decir Más de una letra o número entre el inicio y el final de una palabra. (\b(\w+)\b) Esta palabra será capturada en el grupo número 1, y luego es uno o varios espacios en blanco ( \s+ ), finalmente es Contenido capturado en el grupo 1 (es decir, la palabra que coincide anteriormente) \1 ) 。
Eh... en realidad, la asignación de números de grupo no es tan simple como acabo de decir.
- El grupo 0 corresponde a toda la expresión regular.
- De hecho, el proceso de asignación de números de grupo debe escanear de izquierda a derecha dos veces: la primera vez solo se asignan números a los grupos no nombrados, y la segunda vez solo se asignan a los grupos nombrados; por lo tanto, todos los números de grupo de los grupos nombrados son mayores que los de los grupos no nombrados.
- Puedes usar una sintaxis como (?:exp) para privar a un grupo de la asignación de número de grupo.
También puedes especificar subexpresiones por tu cuenta. Nombre del grupo Para especificar el nombre de un grupo de subexpresión, use la siguiente sintaxis: ( ? < Word>\w+ )(或者把尖括号换成'也行:( ?'Word'\w+ ), así que esto lleva a \w+ El nombre del grupo se designa como Word Para hacer una cita inversa de este grupo. Captura del contenido, puedes usar \k < Word> Así que el ejemplo anterior también se puede escribir así: \b(? < Word>\w+)\b\s+\k < Word>\b 。
Al usar paréntesis, hay muchas gramáticas con usos específicos. A continuación se enumeran algunos de los más comunes:
xxxxxxxxxx
分类 代码/语法 Explicación
-----------------------------------------------------------------------------------------
(exp) 匹配exp,并捕获文本到自动命名的组里
捕获 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
-----------------------------------------------------------------------------------------
(?=exp) 匹配exp前面的位置
Afirmación de ancho cero (?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
-----------------------------------------------------------------------------------------
Comentario (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释
Ya hemos discutido las dos primeras gramáticas. La tercera( ?:exp ) No cambiará la forma en que se procesan las expresiones regulares, solo que el contenido de esta coincidencia de grupo no se capturará en un grupo como en los dos primeros casos, y no tendrá un número de grupo. "¿Por qué querría hacer esto?" — Buena pregunta, ¿por qué crees?
Los siguientes cuatro se utilizan para buscar algo antes o después de ciertos contenidos (pero no incluyen esos contenidos), es decir, funcionan como. \b , ^ , $ se utilizan para especificar una ubicación, que debe cumplir ciertas condiciones (es decir, afirmaciones), por lo que también se les llama Afirmación de ancho cero Lo mejor es ilustrarlo con un ejemplo:
(?=exp)
también llamado
Afirmación anticipada positiva de ancho cero.
ella
Afirmar que la posición posterior a sí misma puede coincidir con la expresión exp.
Por ejemplo.
\b\w+(?=ing\b)
, coincidir con
ing
la parte anterior de la palabra final (excepto
ing
parte externa)
como buscar
I'm
singing while you're
dancing.
Coincidirá.
sing
y
danc
。
(?<=exp)
también llamado
Afirmación posterior a la revisión positiva de ancho cero.
ella
Afirmar que la posición anterior a la aparición de sí misma puede coincidir con la expresión exp.
Por ejemplo (
?<=\bre)\w+\b
coincidir con
la segunda parte de las palabras que comienzan con "re" (excepto "re")
por ejemplo, al buscar
reading
a book
Coincide.
ading
。
¿No te parece que estos términos son demasiado complicados y difíciles de recordar? Yo también lo siento así. Lo importante es saber que existe algo así, su nombre no importa. Si una persona no tiene nombre, puede concentrarse en practicar la espada; si un objeto no tiene nombre, se puede elegir a voluntad...
Una afirmación se utiliza para declarar un hecho que debería ser verdadero. En las expresiones regulares, la coincidencia solo continuará si la afirmación es verdadera.
Si deseas agregar una coma cada tres dígitos en un número muy largo (por supuesto, comenzando desde la derecha), puedes buscar las partes donde necesitas agregar comas al principio y dentro. ((?<=\d)\d{3})+\b Usa esto para. 1234567890 El resultado de la búsqueda es 234567890 。
El siguiente ejemplo utiliza ambos tipos de afirmaciones: (?<=\s)\d+(?=\s) Coincidencia Números separados por espacios en blanco (nuevamente enfatizo, sin incluir estos espacios en blanco). 。
Anteriormente mencionamos cómo buscar. no es un carácter específico o no está en una clase de caracteres determinada el método de los caracteres (antónimo). Pero si solo queremos Asegúrate de que un carácter no aparezca, pero no quieres coincidir con él. ¿Qué hacemos en ese caso? Por ejemplo, si queremos buscar palabras que contengan la letra q, pero que no estén seguidas de la letra u, podríamos intentar lo siguiente:
\b\w * q [ ^u ] \w * \b Coincidencia contiene La letra q que no es seguida por la letra u. la palabra Sin embargo, si haces más pruebas (o si tu pensamiento es lo suficientemente agudo como para darte cuenta directamente), descubrirás que si la 'q' aparece al final de una palabra, como Iraq , Benq , esta expresión dará un error. Esto se debe a que [^u] Siempre debe coincidir con un carácter, así que si q es el último carácter de la palabra, lo que sigue [ ^u] Coincidirá con el delimitador de la palabra que sigue a "q" (que puede ser un espacio, un punto u otra cosa). \w * \b Coincidirá con la siguiente palabra, así que \b\w * q [ ^u]\w * \b puede coincidir completamente Iraq fighting 。 afirmación de ancho cero negativa Puede resolver este tipo de problema porque solo coincide con una ubicación y no. consumo Cualquier carácter. Ahora, podemos resolver este problema de la siguiente manera: \b\w * q(?!u)\w * \b 。
aserción anticipada negativa de ancho cero
(?!exp)
,
Afirmar que detrás de esta posición no se puede coincidir con la expresión exp.
Por ejemplo:
\d{3}(?!\d)
Coincidir con tres dígitos, y esto
Detrás de un número de tres cifras no puede haber un dígito.
;
\b((?!abc)\w)+\b
Coincidencia
No incluye cadenas consecutivas.
abc
la palabra
。
De manera similar, podemos usar (?<!exp) , Afirmación de corte posterior a la revisión negativa de ancho cero. Ven. Afirmar que la posición anterior no puede coincidir con la expresión exp. : (?<![a-z])\d{7} Coincidencia siete dígitos que no son letras minúsculas delante 。
Un ejemplo más complejo: (?<=<(\w+)>). * (?=<\/\1>) Coincidir el contenido dentro de etiquetas HTML simples que no contienen atributos. 。 (?<=<(\w+)>) Se especificó así. prefijo : Palabras entre corchetes angulares (por ejemplo, puede ser < b>),然后是 .* (cadena arbitraria), al final es uno. sufijo (?=<\/\1>) . Presta atención al sufijo. \/ Se utiliza la secuencia de escape de caracteres mencionada anteriormente. \1 es una cita inversa, que cita precisamente Primera serie capturada delante de (\w+) Contenido coincidente, de esta manera, si el prefijo es realmente < b>的话,后缀就是 < /b>了。整个表达式匹配的是 < b>和 < /b>之间的内容(再次提醒,不包括前缀和后缀本身)。
Por favor, analiza detalladamente la expresión. (?<=<(\w+)>). * (?=<\/\1>) Esta expresión muestra mejor el verdadero uso de las afirmaciones de ancho cero.
Otro uso de los paréntesis es a través de la gramática. (?#comment) Incluye comentarios. Por ejemplo: 2[0-4]\d(?#200-249)|25 [ 0-5](?#250-255)|[01]?\d\d?(?#0-199) 。
Para incluir comentarios, es mejor activar la opción "Ignorar espacios en modo de ignorar", así se pueden agregar espacios, tabulaciones y saltos de línea de manera arbitraria al escribir expresiones, y en la utilización real, todo esto será ignorado. Al activar esta opción, todo el texto después del # hasta el final de la línea será considerado como un comentario y se ignorará. Por ejemplo, podemos escribir una expresión anterior de esta manera:
(?<= | # Afirmar el prefijo del texto que debe coincidir. |
<(\w+)> | # Buscar letras o números entre corchetes angulares (es decir, etiquetas HTML/XML) |
) | # Fin del prefijo |
.* | # Coincidir con cualquier texto |
(?= | # Afirmar el sufijo del texto que debe coincidir |
<\/\1> | # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签 |
) | # Sufijo final |
Cuando una expresión regular contiene cuantificadores que permiten repeticiones, el comportamiento habitual es (siempre que se cumpla la condición de que toda la expresión pueda coincidir) hacer coincidir.
Lo más posible.
el carácter. Tomemos esta expresión como ejemplo:
a.
*
b
se emparejará
La cadena más larga que comienza con 'a' y termina con 'b'.
Si se usa para buscar.
aabab
la cadena completa.
aabab
Esto se llama
avaricia
Coincidencia.
A veces, necesitamos más. pereza Coincidencia, es decir, coincidencia. Lo menos posible. Los modificadores dados anteriormente se pueden convertir en un modo de coincidencia perezosa simplemente añadiendo un signo de interrogación después de ellos. ? Así. .*? significa Hacer coincidir una cantidad arbitraria de repeticiones, pero utilizando la menor cantidad de repeticiones posible, siempre que eso permita que la coincidencia total sea exitosa. Ahora veamos un ejemplo de la versión perezosa:
a.
*
?b
Coincidencia
La cadena más corta que comienza con 'a' y termina con 'b'.
Si se aplica a
aabab
la palabra, coincidirá
aab
(Primer a tercer carácter)
y
ab
。
código/sintaxis | Explicación |
---|---|
*? | Repite tantas veces como desees, pero intenta repetir lo menos posible. |
+? | Repetir una vez o más, pero con la menor repetición posible. |
?? | Repetir 0 o 1 vez, pero repetir lo menos posible. |
{n,m}? | Repetir de n a m veces, pero lo menos posible. |
{n,}? | Repetir n veces, pero con la menor repetición posible. |
¿Por qué la primera coincidencia es aab (del primer al tercer carácter) en lugar de ab (del segundo al tercer carácter)? En términos simples, porque hay otra regla en las expresiones regulares que tiene una prioridad más alta que la regla perezosa/greedy: la coincidencia que comienza primero tiene la máxima prioridad: la coincidencia que comienza primero gana.
Arriba se presentan varias opciones, como ignorar mayúsculas y minúsculas y manejar múltiples líneas, que se pueden utilizar para modificar la forma en que se procesan las expresiones regulares. A continuación se muestran las opciones de expresiones regulares más comunes en .Net:
Nombre | Explicación |
---|---|
IgnoreCase
(ignorar mayúsculas y minúsculas)
|
La coincidencia no distingue entre mayúsculas y minúsculas. |
Multiline
(modo de múltiples líneas)
|
cambiar ^ y $ el significado, haciendo que coincidan al principio y al final de cualquier línea, y no solo al principio y al final de toda la cadena. (En este modo, $ El significado exacto es: coincidir con la posición anterior y la posición antes del final de la cadena. |
Singleline
(modo de línea única)
|
Cambia el significado de . para que coincida con cada carácter (incluyendo el salto de línea \n). |
IgnorePatternWhitespace
(ignorar espacios en blanco)
|
Ignorar los espacios en blanco no escapados en la expresión y habilitar por # Comentarios marcados |
ExplicitCapture
(captura explícita)
|
Solo capturar grupos que han sido nombrados explícitamente. |
Una pregunta que se hace con frecuencia es: ¿solo se puede usar uno de los modos, el de múltiples líneas o el de una sola línea, al mismo tiempo? La respuesta es: no. No hay ninguna relación entre estas dos opciones, excepto que sus nombres son bastante similares (lo que puede resultar confuso).
En C#, puedes usar Constructor de Regex(String, RegexOptions) 来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
A veces necesitamos emparejar como ( 100 * ( 50 + 15 ) ) Esta estructura jerárquica anidada se puede utilizar de manera sencilla. \ (.+ \ ) entonces solo coincidirá con el contenido entre el paréntesis izquierdo más a la izquierda y el paréntesis derecho más a la derecha (aquí estamos discutiendo el modo codicioso, también hay problemas en el modo perezoso a continuación). Supongamos que en la cadena original, el número de paréntesis izquierdos y derechos no es igual, por ejemplo, ( 5 / ( 3 + 2 ) ) ) ¿Hay alguna manera de encontrar el contenido entre los paréntesis emparejados más largos en una cadena como esta, donde el número de los dos tipos de paréntesis no será igual?
La gramática de grupos equilibrados presentada aquí es compatible con .Net Framework; otros lenguajes/bibliotecas pueden no soportar esta funcionalidad, o pueden soportarla pero requerir una sintaxis diferente.
Para evitar ( y \ ( Confundamos por completo tu cerebro, mejor usemos los signos de menor y mayor en lugar de los paréntesis. Ahora nuestra pregunta se ha convertido en cómo poner xx aa> yy ¿Puedes capturar el contenido dentro de los corchetes angulares de la cadena más larga?
Aquí se necesita utilizar la siguiente construcción gramatical:
(?'group') Nombrar el contenido capturado como grupo y presionar. Pila
(?'-group') Extraer del stack el último contenido capturado llamado group que fue insertado; si el stack estaba vacío, la coincidencia de este grupo falla.
(?(group)yes|no) Si existe un contenido capturado llamado group en la pila, continúa coincidiendo con la parte de la expresión que dice yes; de lo contrario, continúa coincidiendo con la parte que dice no.
(?!) La afirmación anticipada negativa de ancho cero siempre falla al intentar hacer coincidir, ya que no hay una expresión de sufijo.
我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。
如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。
xxxxxxxxxx
< #el paréntesis izquierdo más externo
[^<>]* #El contenido que no es un paréntesis después del paréntesis izquierdo más externo.
(
(
(?'Open'<) #Encontré un paréntesis izquierdo, escribí "Abrir" en la pizarra.
[^<>]* #Coincidir el contenido que no es un paréntesis después del paréntesis de apertura.
)+
(
(?'-Open'>) #Encontré un paréntesis derecho, borra un "Open"
[^<>]* #Coincidir el contenido después del paréntesis derecho que no sea un paréntesis.
)+
)*
(?(Open)(?!)) #Antes de encontrar el paréntesis derecho más externo, verifica si aún hay "Open" que no se ha borrado en la pizarra; si hay, entonces la coincidencia falla.
> #el paréntesis derecho más externo
Una de las aplicaciones más comunes de un grupo equilibrado es hacer coincidir HTML. El siguiente ejemplo puede coincidir con estructuras anidadas. < div>标签: <div [ ^>] * > [ ^<>]*(((?'Open'] * >) [ ^<>] * )+((?'-Open') [ ^<>] * )+) * (?(Open)(?!)) < /div>
Ya se han descrito muchos elementos para construir expresiones regulares, pero aún hay muchos que no se han mencionado. A continuación se presenta una lista de algunos elementos no mencionados, que incluye la sintaxis y una breve explicación. Puedes encontrar información más detallada en línea para aprender sobre ellos cuando los necesites. Si has instalado la MSDN Library, también puedes encontrar documentación detallada sobre expresiones regulares en .net dentro de ella.
código/sintaxis | Explicación |
---|---|
\a | carácter de alarma (su efecto al imprimir es que la computadora emite un pitido) |
\b | Normalmente es la posición de separación de palabras, pero si se usa dentro de una clase de caracteres representa un retroceso. |
\t | tabulación, Tab |
\r | Entrar |
\v | tabulador vertical |
\f | salto de página |
\n | salto de línea |
\e | Escape |
\0nn | El carácter con el código octal nn en ASCII. |
\xnn | El carácter cuyo código hexadecimal en ASCII es nn. |
\unnnn | El carácter con el código hexadecimal nnnn en el código Unicode. |
\cN | Caracteres de control ASCII. Por ejemplo, \cC representa Ctrl+C. |
\A | Inicio de la cadena (similar a ^, pero no afectado por la opción de múltiples líneas) |
\Z | Fin de la cadena o fin de línea (no afecta la opción de procesamiento de múltiples líneas) |
\z | Fin de cadena (similar a $, pero no afecta el procesamiento de opciones de múltiples líneas) |
\G | Inicio de la búsqueda actual |
\p{name} | Clase de caracteres en Unicode llamada name, por ejemplo \p{IsGreek}. |
(?>exp) | Expresión codiciosa |
(? < x> - < y>exp) | grupo equilibrado |
(?im-nsx:exp) | Cambiar las opciones de procesamiento en la subexpresión exp. |
(?im-nsx) | Cambiar las opciones de procesamiento en la parte posterior de la expresión. |
(?(exp)yes|no) | Trata `exp` como una afirmación anticipada positiva de ancho cero. Si puede coincidir en esta posición, utiliza "yes" como la expresión de este grupo; de lo contrario, utiliza "no". |
(?(exp)yes) | Igual, solo usa expresiones vacías como no. |
(?(name)yes|no) | Si el grupo llamado name ha capturado contenido, utiliza yes como expresión; de lo contrario, utiliza no. |
(?(name)yes) | Igual, solo usa expresiones vacías como no. |
好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?
Si deseas quejarte de mí, o piensas que en realidad podría engañarte de una manera más astuta, o si tienes cualquier otro problema, ¡estás bienvenido! Mi blog Déjame saber.
Recientemente has utilizado: