2010-09-02 10 views
6

Ich habe Probleme beim Aufbau einer regulären Ausdruck mit dem Satz von Saiten über {a, b, c}, die mit genau ein a eine odd Länge. Hier ist mein bester Versuch so weit:wenn Zeichenfolge gerade oder ungerade Länge mit regulären Ausdrücken ist

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

Das tut gut für selbst b und c auf beiden Seiten der a, aber nicht berücksichtigt, für eine ungeradee b und c Kombination auf beiden Seiten der a.

Irgendwelche Hinweise?

Antwort

4

Ihre Zeichenfolge wird von einem von einem Suffix folgte ein Präfix gefolgt sein.

Beide Präfix und Suffix kann Null Länge sein. Wenn nicht, müssen sie entweder gleich oder beide ungleich sein. Dies bedeutet, dass Sie zwei Hauptfälle haben.

EVENPREFIX a EVENSUFFIX | UNEVENPREFIX a UNEVENSUFFIX 

Versuchen Sie, diese (unvollständig und falsch):

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

Es gibt immer noch einen unebenen Fall fehlen: ein einziges [bc]:

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

Nach http://www.fileformat.info/tool/regex.htm, diese Übereinstimmungen

  • a
  • cac
  • ccabb

Ich erwarte, dass es auch den Rest passt ...

Die Seite links garantiert auch (oder leer) Sequenzen von b oder c. Die rechte Seite ist entweder eine einzelne b oder c gefolgt von einem Vielfachen von zwei (so dass es uneben bleibt).

Kobi kam mit dieser Ausgestaltung der oben up:

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

Wie funktionierts?

Die erste Gruppe ist garantiert gerade. Die zweite Gruppe ist garantiert uneben mit einer einzigen a innen. Die dritte Gruppe wird garantiert gerade sein. Somit ist das Ganze garantiert ungleichmäßig.

+1

Sie können das vereinfachen nach '([bc] [bc]) * (a | [bc] a [bc]) ([bc] [bc]) *' - wenden Sie den Wechsel nur dort an, wo Sie ihn brauchen. – Kobi

+0

Die eckigen Klammern funktionieren nicht, weil das bedeutet, dass sie genau einmal übereinstimmen.Die Zeichenkette 'a' selbst sollte eine gültige Zeichenkette sein, da sie ungerade ist, Ihre Regex ist nicht für sich selbst verantwortlich. – ubiquibacon

+0

@Kobi Richtig. Danke, dass du darauf hingewiesen hast. Dies ist ein anderer Gedankengang, obwohl ... –

Verwandte Themen