现在你的代码(如图所示)应该只匹配“Sso”或“SsO”或“Ssm”或“SsM”。
您有两个备选方案,每个备选方案都以Ss
(不带方括号)开头,因此它们将按字面意思匹配。后面是[oO]
or ,但方括号中的字符表示替代项,[omOMomoM]
因此相当于 --即,或[oOmM]
的任何一个字符。o
O
m
M
我将从:%option caseless
使其成为不区分大小写的扫描仪,因此您不必列出每个字母的大写和小写等效项。
那么从字面上列出替代方案可能是最简单的:
s|so|som|some|somet|someth|somethi|somethin|something { printf("found prefix"); }
我想您可以通过按以下顺序执行某些操作来使模式更短(至少在源代码中):
s(o(m(e(t(h(i(n(n(g)?)?)?)?)?)?)?)?)? { printf("found prefix"); }
对我来说这似乎不是一个巨大的进步,但有些人可能会觉得它比我更有吸引力。
如果您不想使用%option caseless
基本思想,则更有帮助:
[sS]([oO]([mM]([eE]([tT]([hH]([iI]([nN]([gG])?)?)?)?)?)?)?)? { printf("found prefix"); }
列出大写和小写的所有可能组合将变得乏味。