我正在使用一些语法在词法分析期间检测字符串
"".*"" return TOK_STRING;
但这不起作用。
我想你想要
\".*\"
但请注意,flex 中的 . 不匹配换行符。而且,正如 @chqrlie 在评论中提到的,它确实匹配“,因此它将匹配最后一个字符串的末尾,而不是当前字符串的末尾。
所以更好的模式可能是:
\"[^"]*\"
(
[^"]
匹配包括换行符在内的任何字符,除了 " 之外)。
但是你无法在字符串中包含 " 。所以你必须决定应该采用什么语法。如果你想实现 SQL 风格,用双引号代表字符串中的单引号,你可以使用
\"([^"]|\"\")*\"
对于可能更常见的反斜杠转义:
\"([^"]|\\(.|\n))*\"
你想要这个:
"(".*")|(".*)"
一旦词法分析器到达第一个引号,这将开始匹配字符串,然后一旦词法分析器到达第二个引号,它将停止匹配字符串。它还神奇地忽略字符串中的任何转义引号。