String 如何使用lex识别引号以外的字符串?

String 如何使用lex识别引号以外的字符串?,string,lex,String,Lex,真正的莱克斯新手。我试图使用正则表达式来识别printf()中的字符串,例如printf(“hello world!”),但最好的结果是“hello world!”,我不想要双引号,只要hello world!我该怎么办 到目前为止,正则表达式是:(“\”)(.*(“\”)匹配字符串文本的良好正则表达式是: ["]([^"]|\\(.|\n))*["] ["]([^"\n]|\\(.|\n))*["] 第一个在多行字符串上失败;第二个接受它们。在这两种情况下,不匹配的引号将不匹配。您需要使用其

真正的莱克斯新手。我试图使用正则表达式来识别
printf()
中的字符串,例如
printf(“hello world!”),但最好的结果是“hello world!”,我不想要双引号,只要hello world!我该怎么办


到目前为止,正则表达式是:
(“\”)(.*(“\”)

匹配字符串文本的良好正则表达式是:

["]([^"]|\\(.|\n))*["]
["]([^"\n]|\\(.|\n))*["]
第一个在多行字符串上失败;第二个接受它们。在这两种情况下,不匹配的引号将不匹配。您需要使用其他模式处理这些错误输入。这两种模式都接受反斜杠转义(包括反斜杠转义换行),而不进行任何解释。大多数现实生活中的词汇扫描程序都希望以某种方式处理反斜杠转义序列,通常是将它们转换为它们所代表的字符。但这需要一个不同的机制,这超出了这个问题的范围

正如您所发现的,匹配包含引号,因此您将希望删除它们。由于您通常必须复制匹配标记(因为下次调用扫描仪时,
yytext
的内容将被覆盖),因此只需复制您感兴趣的匹配部分即可轻松完成

请记住,
yyleng
是令牌的长度。因此,您想要的子字符串从
yytext+1
(跳过开头的引号)开始,然后继续到
yyleng-2
字符(不包括任何一个引号):


当然,还有其他的编写方法,但它们都是相似的。

请向我们展示您的正则表达式!谢谢你的评论!也是一个真正的StackOverflow新手(lol)| | |它只是(“\”)(“*”)(“\”)。我试过很多其他的乱七八糟的版本,它已经是最好的了。。。这是我第一堂编译原理实验课的一部分,我已经被这个问题纠缠了将近一个星期。我真的很想解决这个奇怪的问题,这让我觉得lex没有提供相关的方法来“删除”辅助识别的内容。如果在同一行上有两个字符串文本,则正则表达式将失败。你明白为什么了吗?谢谢你的帮助!可能理解。。。它将匹配最远的符号,这是最长的部分,这部分将在引号的中间。是这样吗?非常感谢!我查阅了很多相关信息,但我没有使用regex直接解决这个问题。。。所以我开始犹豫,认为这似乎是lex本身的一个小缺陷,这对用于识别的双引号似乎不可避免地会附在结果上。目前,我对正则表达式的理解还很肤浅。您已经给出了使用后续代码修改结果的方法。这种指点确实拓宽了我的思路。再次感谢你!这对我有很大的帮助。☀️
["]([^"]|\\(.|\n))*["]  {
          yylval.str = malloc(yyleng -1);
          memcpy(yylval.str, yytext + 1, yyleng - 2);
          yylval.str[yyleng - 2] = 0;
        }