2008-08-07 37 views
10

He trabajado durante 5 años principalmente en aplicaciones de escritorio Java accediendo a bases de datos Oracle y nunca he usado expresiones regulares. Ahora entro en Stack Overflow y veo muchas preguntas sobre ellos; Siento que me perdí algo.¿Qué son buenas expresiones regulares?

¿Para qué usas expresiones regulares?

P.S. perdón por mi inglés malo

+0

No olvide leer los Javadocs para java.util.regex.Pattern. Es una buena referencia. También http://perldoc.perl.org/perlre.html –

Respuesta

7

Consideremos un ejemplo en Ruby:

puts "Matched!" unless /\d{3}-\d{4}/.match("555-1234").nil? 
puts "Didn't match!" if /\d{3}-\d{4}/.match("Not phone number").nil? 

El "/ \ d {3} - \ d {4}/"es la expresión regular, y como pueden ver es MUY co ncise forma de encontrar un partido en una cadena.

Por otra parte, el uso de grupos se puede extraer información, como por ejemplo:

match = /([^@]*)@(.*)/.match("[email protected]") 
name = match[1] 
domain = match[2] 

Aquí, el paréntesis en la expresión regular marcan un grupo de captura, para que pueda ver exactamente lo que los datos es que se emparejado, por lo puedes hacer un procesamiento adicional.

Esto es solo la punta del iceberg ...hay muchas cosas diferentes que puede hacer en una expresión regular que hace que procesar texto sea REALMENTE fácil.

0

Una expresión regular (regex o regexp para abreviar) es una cadena de texto especial para describir un patrón de búsqueda. Puedes pensar en expresiones regulares como comodines con esteroides. Probablemente esté familiarizado con las anotaciones comodín como *.txt para encontrar todos los archivos de texto en un administrador de archivos. El equivalente en expresiones regulares es .*\.txt$.

Un gran recurso para las expresiones regulares: http://www.regular-expressions.info

7

expresiones regulares (o expresiones regulares) se utilizan para el ajuste de patrones en cadenas. De este modo, puede extraer todas las direcciones de correo electrónico de un texto porque sigue un patrón específico.

En algunos casos, las expresiones regulares se incluyen en barras inclinadas y después de la segunda barra se colocan opciones como la insensibilidad a mayúsculas y minúsculas. Aquí está uno bueno :)

/(bb|[^b]{2})/i 

Hablado se puede leer "2 be or not 2 be".

La primera parte son los (paréntesis), están divididos por la tubería | carácter que equivale a una declaración o para que (a | b) coincida con "a" o "b". La primera mitad del área de tuberías coincide con "bb". El nombre de la segunda mitad no lo sé, pero son los corchetes, coinciden con cualquier cosa que sea y no "b", por eso hay un símbolo de techo thingie (término técnico) allí. Los corchetes coinciden con un recuento de las cosas que tienen delante, en este caso dos caracteres que no son "b".

Después de la segunda/es una "i" que lo hace insensible a mayúsculas y minúsculas. El uso de las barras de inicio y final es específico del entorno, a veces lo haces y otras no.

dos enlaces que creo que usted encontrará útil para esto son

  1. regular-expressions.info
  2. Wikipedia - Regular expression
+0

Es una buena descripción, pero el ejemplo del mundo real de Mike es preferible al juego de palabras "2b". Sería bueno combinar los dos. –

+0

Los paréntesis 'squiggly' con respecto a '2' no son tan comunes, son' rizados' .. – Timo

0

Como ya sabrá, Oracle ahora tiene expresiones regulares: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html. He utilizado la nueva funcionalidad en algunas consultas, pero no ha sido tan útil como en otros contextos. La razón, creo, es que las expresiones regulares son las más adecuadas para encontrar datos estructurados enterrados dentro de datos no estructurados.

Por ejemplo, podría usar una expresión regular para encontrar los mensajes de Oracle que están rellenos en el archivo de registro. No es posible saber dónde están los mensajes, solo cómo se ven. Entonces, una expresión regular es la mejor solución para ese problema. Cuando trabajas con una base de datos relacional, los datos suelen estar preestructurados, por lo que una expresión regular no brilla en ese contexto.

2

Si quiere aprender sobre las expresiones regulares, recomiendo Mastering Regular Expressions. Va desde los conceptos más básicos, hasta los diferentes motores que funcionan debajo. Los últimos 4 capítulos también ofrecen un capítulo dedicado a cada uno de PHP, .Net, Perl y Java. Aprendí mucho de él y todavía lo uso como referencia.

6

más fresco expresión regular vez:

/^1?$|^(11+?)\1+$/ 

Comprueba si un número es primo. ¡¡Y funciona!!

N.B .: para que funcione, se necesita un poco de configuración; el número que se quiere probar se tiene que convertir en una cadena de “1” s primero, continuación podemos aplicar la expresión para probar si la cadena no contienen un número primo de “1” s:

def is_prime(n) 
    str = "1" * n 
    return str !~ /^1?$|^(11+?)\1+$/ 
end 

Hay una explicación detallada y muy accesible en Avinash Meetoo’s blog.

+2

¡Es inteligente, pero apenas apropiado para un principiante! :) –

+0

Eso no parece funcionar ... o me falta algo. – Copas

+0

@Copas: funciona absolutamente. ¿Has leído el tutorial y la explicación que he vinculado? –

0

Estos del RE son específicos de Visual Studio y C++ pero he encontrado que fue amable a veces:

Encuentra todas las apariciones de "RoutineName" con params no predeterminados pasado:

RoutineName \ (: a + \)

inversa para encontrar todas las apariciones de "RoutineName" con solo defecto: RoutineName \ (\)

Para buscar el código habilitado (o deshabilitado) en una compilación de depuración:

\ #if. _DEBUG *

Tenga en cuenta que este cogerá todas las variantes: ifdef, si está definido, ifndef, si!definido

0

Validación de contraseñas fuertes:

Éste validará una contraseña con una longitud de 5 a 10 caracteres alfanuméricos, con al menos un caso superior, uno inferior caso y un dígito:

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$