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

RegEx expression that will match string of a particular format

我有一行 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;
}
"ORDER BY DESC"([^)]*) could be a solution for this question.