Determine if string is even or odd length with regular expression
I am having trouble building a regular expression with t开发者_运维知识库he set of strings over {a, b, c}
that is an odd
length with exactly one a
. Here is my best attempt so far:
(bb|bc|cb|cc)*a(bb|bc|cb|cc)*
This does good for even b
and c
on either side of the a
, but does not account for a odd b
and c
combination on either side of the a
.
Any hints?
Your string will be a prefix followed by a followed by a suffix.
Both prefix and suffix can be zero length. If not, they have to be either both even or both uneven. This means you have two main cases.
EVENPREFIX a EVENSUFFIX | UNEVENPREFIX a UNEVENSUFFIX
Try this (incomplete and wrong):
([bc][bc])*a([bc][bc])*|([bc][bc][bc])*a([bc][bc][bc])*
There is still one uneven case missing: a single [bc]
:
(([bc][bc])*a([bc][bc])*)|([bc]([bc][bc])*a[bc]([bc][bc])*)
According to http://www.fileformat.info/tool/regex.htm, this matches
a
cac
ccabb
I expect it matches the rest too...
The left side guarantees even (or empty) sequences of b
or c
.
The right side is either a single b
or c
followed by a multiple of two (so that it stays uneven).
Kobi came up with this refinement of the above:
([bc][bc])*(a|[bc]a[bc])([bc][bc])*
How does this work?
The first group is guaranteed to be even. The second group is guaranteed to be uneven with a single a
inside. The third group is guaranteed to be be even. Thus, the whole is guaranteed to be uneven.
精彩评论