2010-09-02 30 views
6

Tengo problemas para la construcción de una expresión regular con el conjunto de cadenas sobre {a, b, c} que es una longitud odd con exactamente uno a. Aquí está mi mejor intento hasta el momento:Determinar si la cadena es de longitud par o impar con expresión regular

(bb|bc|cb|cc)*a(bb|bc|cb|cc)* 

Esto hace el bien, incluso para b y c a ambos lados de la a, pero no da cuenta de una extraña y bc combinación de ambos lados de la a.

¿Alguna pista?

Respuesta

4

La cadena será un prefijo seguido de un seguido de un sufijo.

Tanto prefijo y sufijo puede ser cero longitud. Si no, tienen que ser ambos pares o ambos desiguales. Esto significa que tienes dos casos principales.

EVENPREFIX a EVENSUFFIX | UNEVENPREFIX a UNEVENSUFFIX 

Prueba esto (incompleta y mal):

([bc][bc])*a([bc][bc])*|([bc][bc][bc])*a([bc][bc][bc])* 

todavía hay un caso irregular que falta: un solo [bc]:

(([bc][bc])*a([bc][bc])*)|([bc]([bc][bc])*a[bc]([bc][bc])*) 

Según http://www.fileformat.info/tool/regex.htm, este coincide con

  • a
  • cac
  • ccabb

espero que coincide con el resto también ...

la izquierda garantiza secundarios incluso (o vacíos) o secuencias de bc. El lado derecho es b o c seguido de un múltiplo de dos (para que no se vea uniforme).

Kobi ocurrió este refinamiento de lo anterior:

([bc][bc])*(a|[bc]a[bc])([bc][bc])* 

¿Cómo funciona esto?

El primer grupo está garantizado que es par. El segundo grupo está garantizado para ser desigual con un solo a dentro. El tercer grupo está garantizado que sea par. Por lo tanto, se garantiza que el todo será desigual.

+1

Puede simplificar eso en '([bc] [bc]) * (a | [bc] a [bc]) ([bc] [bc]) *' - aplique la alternancia solo donde lo necesite. – Kobi

+0

Los corchetes no funcionarán porque eso significa que coinciden exactamente una vez.La cadena 'a' en sí misma debe ser una cadena válida ya que es impar, su expresión regular no cuenta por sí misma. – ubiquibacon

+0

@Kobi Correcto. Gracias por señalar eso. Sin embargo, esta es una línea de pensamiento diferente ... –

Cuestiones relacionadas