RegEx表达式,它将匹配特定格式的字符串

时间:2017-04-25 21:49:28

标签: regex flex-lexer

我有ORDER BY DESC(?year)行,其中?year可以是任何后跟问号(?)的内容,例如?name,?address等。我已尝试ORDER BY DESC\(\?[a-z]+\)来将整个字符串捕获为ORDER BY DESC(?year)但不起作用。

lex文件:

%{
#include <cstdio>
#include <iostream>
#include "grammar.tab.h"
%}

%option case-insensitive

%%
[1-9][0-9]*         { yylval.i = atoi(yytext); return INT_NUM; }
"ORDER BY DESC\(\?[a-z]+\)"     { yylval.s = strdup(yytext); return ORDER_BY_DESC; }            
"\n"                { yylineno++; }
\.                  { return DOT; }             
[ \t]+              { /* ignore white space */ }                                                                                                            
"#".*               { /* ignore comments */ }
[ \t\v\f\r]+            { }
.               { std::cerr << "Lexical Error!\n"; }        
%%

int yywrap() {
    return 1;
}

野牛档案:

    %{
    #include <iostream>
    #include <cstdlib>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sstream>
    #include <string>
    #include <regex>

    using namespace std;

    extern int yylineno;
    extern int yylex();

    void yyerror(char *s, ...);
    %}

    %error-verbose

    %union
    {
        int i;
        char *s;
    }
    %token<i> INT_NUM;
    %token<s> ORDER_BY_DESC;

    %%
    order_by:
            | ORDER_BY_DESC
            {
                   string s($<s>1); 
                   string str = s.substr(0, s.size() - 1);
                   char *x = new char[str.length() + 1];
                   order_by_stmt = str;
                   strcpy(x, str.c_str());
                   $<s>$ = x;
            }
        ;

    %%

    void yyerror(char *s, ...) {
        va_list ap;
        va_start(ap, s);
        fprintf(stderr, "%d: error: ", yylineno);
        vfprintf(stderr, s, ap);
        fprintf(stderr, "\n");
    }


int main() {

    yyparse();

    return 0;
}

1 个答案:

答案 0 :(得分:0)

"ORDER BY DESC"([^)]*) could be a solution for this question.