2013-03-19 1 views
0

В строке здесь:регулярных выражения: Разделительные слов до и после двоеточия

Category Shoes brand:char[30];cost:float;years:int

Я пытаюсь написать два отдельных выражения регулярных выражений: один, чтобы отделить метку, которая будет отображаться перед двоеточием, и другой, чтобы получить выражение после двоеточия до следующей точки с запятой или конца строки. ..

До сих пор я придумал

а) [^:]+ для первого случая

б) [\:...\;] для второго случая

Мои файлы Flex читает:

%% 
[^:]+  { printf("\nLabel: %s\n",yytext); } 
[\:...\;] { printf("\nType: %s\n",yytext); } 
%% 

Однако выход выглядит следующим образом:

Label: char 
Category Shoes brand 

Type: : 

Label: char[30];cost 

Type: : 

Label: float;years 

Type: : 

Любые данные о том, как я буду решать это, были бы замечательными.

EDIT:

Ожидаемый результат:

Label: brand 

    Type: char[30] 

    Label: cost 

    Type: float 

    Label: years 

    Type: Float 
+1

Вы можете разместить точный вывод, который вы хотите получить? – bchurchill

+0

Хороший звонок, сделано. – Louis93

+0

Пока не понимаю. Почему последний «тип» Float (с капитолом F) и почему существует больше «типов», чем «ярлыки»? – bchurchill

ответ

1
%% 

[a-zA-Z0-9]+: { printf("Label: <<%s>>\n", yytext); } 
[a-zA-Z0-9]+ { printf("Word: <<%s>>\n", yytext); } 
[^:\;]+\;  { printf("Type: <<%s>>\n", yytext); } 
.    { printf("Skip: <<%s>>\n", yytext); } 

%% 

Пример вывода (для ввода образца):.

Word: <<Category>> 
Skip: << >> 
Word: <<Shoes>> 
Skip: << >> 
Label: <<brand:>> 
Type: <<char[30];>> 
Label: <<cost:>> 
Type: <<float;>> 
Label: <<years:>> 
Word: <<int>> 
+0

Любые хорошие ресурсы для Regex, которым вы доверяете? Я был в полуисследовании, используя quickrefs. – Louis93

+1

Книга Джеффа Фридля [Освоение регулярных выражений] (http://regex.info/), возможно, самая лучшая. (Как это бывает, я перечитываю его на данный момент.) Это не касается Flex, но если вы понимаете, что в нем, понимание Flex не сложно. –

+0

Отлично, я дам ему прочитать. – Louis93

1

flex manual Проверить для лучшего понимания гибких моделей. Я считаю, что кусок кода ниже делать то, что вы ожидали (не проверено)

%x INTYPE 
h 
[a-z]*`:` { printf("\nLabel: %s\n",yytext); BEGIN(INTYPE); } 

<INTYPE>{ 
    ; { BEGIN(INITIAL); } 
    [a-z"[""]"0-9]* {printf("\ntype: %s\n",yytext); } 
} 
Смежные вопросы