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

时间:2020-12-24 09:40:20

I have a line with ORDER BY DESC(?year) where ?year can be anything followed by a question mark (?) such as ?name, ?address etc. I have tried ORDER BY DESC\(\?[a-z]+\) to capture the whole string as ORDER BY DESC(?year) but not working.

我有一个ORDER BY DESC(?年)的行,其中?year可以是任何后跟一个问号(?),如?name,?address等。我试过ORDER BY DESC \(\?[az] + \ )将整个字符串捕获为ORDER BY DESC(?年)但不起作用。

lex file:

%{
#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;
}

bison file:

    %{
    #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 个解决方案

#1


0  

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

#1


0  

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