2011-07-01 12 views
5

Necesito una expresión regular que coincida con cualquier cadena que contenga como máximo 2 guiones y 2 puntos. No TIENE que haber un guion ni un punto, pero si hay 3+ guiones o 3 puntos o incluso tanto 3+ guiones como 3+ puntos, la expresión regular no debe coincidir con la cadena.Regex que coincide si hay dos apariciones máximas de punto y guión

Diseñado para usar en PHP.
Sé de alternativas fáciles utilizando funciones de PHP, pero debe ser utilizado en un sistema grande que solo permita el filtrado utilizando expresiones regulares.

Ejemplo cadena que será igualada:
hello-world.com

Ejemplo cadena que no va a ser igualada:
www.hello-world.easy.com o hola-mundo-i- win.com

+0

¿Puede explicar por qué es necesario este requisito? ¿Estás tratando de validar urls? – balki

+0

No veo cómo una URL con más de dos puntos sería inválida :-) Sin embargo, es para filtrar las url OUT que son demasiado complejas y parecen autogeneradas. – Zoon

Respuesta

6

¿Coincide con tus expectativas?

(?!^.*?([.-]).*\1.*\1.*$)^.*$ 

Ver que here on Regexr

(?!^.*?([.-]).*\1.*\1.*$) es una búsqueda negativa hacia delante. Que coincide con la primera .- lo puso en el grupo de captura de 1, y luego comprueba si hay dos más de ellos usando HTE retrorreferencia \1. Tan pronto como encuentre tres, la expresión ya no coincidirá.

^.*$ partidos de todo, desde el principio hasta el final, si la búsqueda negativa hacia delante no ha igualado.

+0

Gracias por las explicaciones. Funciona perfecto también. – Zoon

0

Utilice esta: (?!^.*?([-.])(?:.*\1){2}.*$)^.*$

1

Esta prueba expresiones regulares hará el truco:

$re = '/# Match string with 2 or fewer dots or dashes 
    ^       # Anchor to start of string. 
    (?=[^.]*(?:\.[^.]*){0,2}$) # Assert 2 or fewer dots. 
    (?=[^\-]*(?:-[^\-]*){0,2}$) # Assert 2 or fewer dashes. 
    .*       # Ok to match string. 
    $       # Anchor to end of string. 
    /sx'; 
Cuestiones relacionadas