Las expresiones regulares son los patrones que definen un conjunto de cadenas sin enumerar sus elementos. Muchos lenguajes de programación como Perl, o en mi caso, PHP, los usan. En PHP por ejemplo, lo usan funciones como preg_match, o ereg. La mejor manera de aprender a entender y usar las expresiones regulares es practicar con ellas.

^algo
Se usa para encontrar algo al inicio:
“algo asd” -> Correcto

algo$
Se usa para encontrar algo al final:
“asd algo” -> Correcto

\” se usa para escapar caracteres.
.” representa cualquier caracter, salvo el de nueva línea.

abc(d*)ef Se usa cuando puede aparecer 0 o más veces:
abcdef, abcef, abcddddef -> Correcto

abc(d?)ef Se usa cuando puede aparecer 0 o 1 vez:
abcdef, abcef -> Correcto

abc(d+)ef Se usa cuando puede aparecer 1 o más veces:
abcdef, abcdddddef -> Correcto

\s equivale a un espacio en blanco.
\S equivale a cualquier cosa que no sea un espacio en blanco.
\d equivale a cualquier dígito.
\D equivale a cualquier cosa que no sea un dígito.
\w equivale a cualquier dígito, letra o guión bajo.
\W equivale a cualquier cosa que no sea dígito, letra o guión bajo.

x(y{a,b})z Se usa cuando puede aparecer un mínimo de ‘a’ veces y un máximo de ‘b’ veces.
Ejemplo: x(y{1,3})z
xyz, xyyz, xyyyz -> Correcto
x(y{n})z Se usa cuando puede aparecer n veces
Ejemplo: x(y{2})z
xyyz -> Correcto
Otros ejemplos:
x(y{2, })z -> Se usa cuando puede aparecer dos o más veces.
x(y{0,3})z > Se usa cuando puede aparecer tres o menos veces.

Los corchetes [] nos sirven para definir rangos (de caracteres ascii).
Ejemplo: ab[c-f]g
abcg, abdg, abeg, abfg -> Correcto
Se usa ^ para negar. [^cd] Se usa cuando no puede aparecer ni c ni d.
Ejemplo: ab[^cd]ef
abjef -> Correcto, abcef -> Incorrecto

POSIX
[[:alpha:]] -> Caracteres alfabéticos.
[[:digit:]] -> Caracteres numéricos.
[[:alnum:]] -> Caracteres alfanuméricos.
[[:space:]] -> Espacios en blanco.
[[:upper:]] -> Cualquier mayúscula.
[[:lower:]] -> Cualquier minúscula.

Los paréntesis se usa cuando se quiere buscar algo literal.
(abc) Para que sea verdadero tiene que tener “abc”.

Las barras verticales son sinónimo del operador lógico OR. Es verdadero si una de las dos aparece:
(a|b) Para que sea verdadero tiene que ser, o ‘a’, o ‘b’.

\d{x} Se usa cuando queremos que aparezca un número decimal de X cifras.
\d{x,y} Se usa cuando queremos que aparezca un número decimal de X o Y cifras (ver ejemplo 4).

Usamos (.+) cuando queremos seleccionar la cadena que se encuentra entre dos parámetros, en el que uno lo empieza a buscar por la izquierda y el otro por la derecha (ver ejemplo 5)

Ejemplos prácticos:
Ejemplo 1

<?
$cadena = '0123456789';
preg_match_all('/2([0-9]+)8/', $cadena, $salida);
 
echo $salida[0][0];
echo $salida[0][1];
?>

Devuelve:
2345678
34567

Se refiere a lo que se encuentra entre 0 y 8 (que tienen que ser números).

Ejemplo 2

<?
$cadena = '01234567898999555';
preg_match_all('/([^5-7]*)/', $cadena, $salida);
 
echo $salida[0][0];
?>

Devuelve:
01234
Al llegar a [5-7] se para, y devuelve todo lo anterior.

Ejemplo 3

<?
$cadena = '<img src="http://google.com/prueba.jpg width="720" height="320">';
preg_match_all('/<img src=("|\')/', $cadena, $salida);
 
echo $salida[1][0];
?>

Nos devuelve:

Nos sirve para saber si se usan comillas simples o dobles, en este caso, dobles.

Ejemplo 4

<?
$cadena = '26/01/1992';
preg_match_all('/(\d{1,2})(-|\/)(\d{1,2})(-|\/)(\d{2,4})/', $cadena, $salida);
 
echo $salida[0][0];
?>

Devuelve:
26/01/1992
Sirve para autentificar una fecha. Podriamos usar guiones, o barras inclinadas. En los dias y meses podriamos usar números de una o dos cifras, y para los años de dos o de cuatro.

Ejemplo 5

<?
$cadena = 'Esta es una cadena de texto de ejemplo';
preg_match_all('/ (.+) /', $cadena, $salida); //Notese los espacios
 
echo $cadena[1][0];
?>

Nos devuelve:
es una cadena de texto de
Debido a que seleccionó la cadena que se encuentra entre dos espacios en blanco, encontrados el primero por la izquierda y el segundo por la derecha.

Ejemplo 6

<?
$cadena2 = '<img src="http://google.com/prueba.jpg" width="320" height="640">';
preg_match_all('/(<img src=").*?("(\s)?)/', $cadena, $salida);
 
echo $salida[0][0];
?>

Nos devuelve:
img src=”http://google.com/prueba.jpg”
Esto nos puede servir para poder obtener todos los enlaces o imágenes de una página, ahora solo tendriamos que eliminar el término constante