regex - Lex - 字符串内的双引号

标签 regex string lex

我有包含双引号字符串规则的 lex 语法:

...
%x DOUBLEQUOTE
...
%%
"\""                { yylval->string = NULL; BEGIN(DOUBLEQUOTE); }
<DOUBLEQUOTE> {
    "\n"            {
                        /* reset column counter on new line */
                        PARSER->linepos = 0;
                        (PARSER->linenum)++;
                        expr_parser_append_string(PARSER, &(yylval->string), yytext);
                    }
    [^\"\n]+        { expr_parser_append_string(PARSER, &(yylval->string), yytext); }
    "\\\""          { expr_parser_append_string(PARSER, &(yylval->string), yytext); }
    "\""            {
                        BEGIN(INITIAL);
                        if ( yylval->string != NULL )
                            string_unescape_c(yylval->string);
                        return ( TOKEN_STRING );
                    }
}

不知何故,转义序列 \" 仅在字符串的开头匹配。如果 \"后者出现在字符串中,它看起来像字符 \ " 分别匹配。

例如:
  • 通行证:"\" "
  • 失败:" \" "
  • 失败:"This is string example: \"a string inside of string\""

  • 为什么要转义序列 \" 当出现在字符串中时与规则 "\\\"" 不匹配?

    最佳答案

    如果反斜杠不是引用字符串中的第一个字符,则反斜杠将在某个标记的末尾匹配。例如:

     "abc\"def"
      ^^^^       First token, longest match of [^"\n]+
          ^      Terminates quoted string
    

    因此,您还需要排除反斜杠。但是一旦你这样做了,你需要提供一个匹配反斜杠转义的模式,而不仅仅是反斜杠转义的引号。所以我建议:
    <DOUBLEQUOTE>{
      \\?\n              { /* Handle newline */ }
      ([^"\\\n]|\\.)+    { expr_parser_append_string(PARSER,
                                                     &yylval->string,
                                                     yytext); }
      \"                 { BEGIN(INITIAL); ... }
    }
    

    注意:我在第一个模式的开头添加了一个可选的反斜杠,以处理反斜杠紧跟在换行符之前的情况。 .在第二个模式中( \\. )将不匹配换行符,否则根本无法识别反斜杠换行符。

    关于regex - Lex - 字符串内的双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32618512/

    相关文章:

    javascript - 匹配 Javascript 代码语句的结尾

    php - 如何删除字符串中的所有前导零

    java - 'messy'字符串到int转换java

    c - 使用 lex 检测 float

    c - 如何声明 C 字符串数组

    regex - 柔性/莱克斯 : Lookahead predicate - unrecognized rule

    JavaScript 正则表达式模式 - 困惑

    regex - 如何使用 Notepad++ 正则表达式搜索匹配 HTML 属性?

    python - Python 中 numpy 字符串数组的功能屏蔽

    C++函数返回字符串