Прямо сейчас ваш код (как показано) должен соответствовать только "Sso" или "SsO" или "Ssm" или "SsM".
У вас есть две альтернативы, каждая из которых начинается с Ss
(без квадрата)скобки) так что те будут совпадать буквально.Затем следует либо [oO]
, либо [omOMomoM]
, но символы в квадратных скобках представляют альтернативы, так что это эквивалентно [oOmM]
--ie, любому одному из символов 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"); }
Перечисление всех возможных комбинаций верхнего и нижнего регистра будет утомительным.