регулярное выражение flex не соответствует должным образом

В моем файле токенизатора (.lex) я хочу сопоставить следующий шаблон:

AaBC12/awD41/dfs21 etc...

Я написал это правило

[A-Za-z]+[A-Za-z0-9]*[[/]+[A-Za-z][A-Za-z0-9]*]* 
{lline = cpflineno;cpflval.str = strdup(cpftext);return K_IDENTIFIER;}

Это правило кажется мне правильным, но если у меня есть такой ввод:

TOP/MD1 
TOP/MD2
TOP/MD2/D/E

Мой вывод

TOP/MD1
TOP/MD2
TOP/MD2
/D/E  

вместо

TOP/MD1
TOP/MD2
TOP/MD2/D/E

Не могли бы вы сказать мне, где мое правило не работает?


person djfoxmccloud    schedule 08.06.2011    source источник


Ответы (1)


Что насчет этого:

[A-Za-z]+[A-Za-z0-9]*([/]+[A-Za-z][A-Za-z0-9]*)* 

Заменил [] на (), где вы имеете в виду группу.

Обратите внимание, что он будет соответствовать foo////bar, если вы не хотите удалять второй + (и первый +, если на то пошло, в данном случае это бесполезно).

person Qtax    schedule 08.06.2011
comment
Это было очевидно. Я думал [] работает так же. Я, должно быть, устал, спасибо ;) - person djfoxmccloud; 08.06.2011