Как я могу убедиться, что регулярное выражение не соответствует пустой строке? - PullRequest
1 голос
/ 12 марта 2010

Я использую генератор синтаксического анализатора Jison для Javascript и у меня возникли проблемы с моей спецификацией языка.

Программа, которую я пишу, будет калькулятором, который может обрабатывать футы, дюймы и шестнадцатые. Для этого у меня есть следующая спецификация:

%%
([0-9]+\s*"'")?\s*([0-9]+\s*"\"")?\s*([0-9]+\s*"s")? {return 'FIS';}
[0-9]+("."[0-9]+)?\b  {return 'NUMBER';}
\s+                   {/* skip whitespace */}
"*"                   {return '*';}
"/"                   {return '/';}
"-"                   {return '-';}
"+"                   {return '+';}
"("                   {return '(';}
")"                   {return ')';}
<<EOF>>               {return 'EOF';}

Большинство этих строк взяты из базовой спецификации калькулятора. Я просто добавил первую строку.

Регулярное выражение правильно сопоставляет футы, дюймы, шестнадцатые, например 6'4" (шесть футов, 4 дюйма) или 4"5s (4 дюйма, 5 шестнадцатых), с любым видом пробела между цифрами и индикаторами.

Проблема в том, что регулярное выражение также соответствует пустой строке. В результате лексический анализ всегда записывает FIS в начале строки, а затем анализ не выполняется.

Вот мой вопрос: есть ли способ изменить это регулярное выражение, чтобы гарантировать, что оно будет соответствовать только строке ненулевой длины?

EDIT Хотя в регулярном выражении есть группы захвата, мне не нужно захватывать эти группы. Я знаю, что могу использовать группы без захвата, но это немного яснее без (?:...).

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Вы можете добавить (?=.) в начале вашего регулярного выражения.

0 голосов
/ 12 марта 2010

Проблема в том, что все в первой строке необязательно - либо ? (0 или 1), либо * (0 или более).

Я не слишком знаком с имперской системой (я никогда раньше не видел шестнадцатых ...), но, возможно, что-то вроде

([0-9]+\s*["'s])+    (with whatever escaping is necessary for the " and ' - I'm not a javascript guy)

Это определенно гарантирует, что она не соответствует пустой строке, проблема в том, что она допускает что-то вроде 5s 4 "6 ', что, вероятно, не совсем то, что вы хотите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...