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
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.
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
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
@Kobi Richtig. Danke, dass du darauf hingewiesen hast. Dies ist ein anderer Gedankengang, obwohl ... –