如何使用正则表达式(词法分析)表达类似cpp的字符串(词法分析)
问题描述:
我正在写一个cpp程序,它是一个类似于cpp的语言的词法分析器。为了找到每个标记,我使用正则表达式来匹配,然后决定选择正确的标记。如何使用正则表达式(词法分析)表达类似cpp的字符串(词法分析)
这种语言的字符串和cpp完全一样。我使用的正则表达式是这样的:
\"([^\\\"]|\\.)?\"
但它不是真的正确。对于这样的输入:
"String \" int"
输出应该是一个字符串标记,但我的正则表达式,我得到一个字符串标记(“字符串”)和一个int关键字,然后一个错误。
你有什么想法如何处理?或者我应该如何改变正则表达式?
P.S. :我使用regex_search()来查找匹配。
谢谢。
答
您可以使用
std::regex rx(R"(\"[^\"\\]*(?:\\.[^\"\\]*)*\")");
模式是"[^"\\]*(?:\\.[^"\\]*)*"
:
-
"
- 一个双引号 -
[^"\\]*
- 零个或多个字符不是一个双引号和反斜线 -
(?:\\.[^"\\]*)*
其他 - 零次或多次重复的-
\\.
- 在前面一个反斜杠任何字符(与[\s\S]
,如果你需要更换.
也支持逃脱换行符) -
[^"\\]*
- 零个或多个字符不是一个双引号和反斜线
其他
-
-
"
- 双引号。
查看regex demo。
'“String \”int“'字符串常量不包含'''char。使用'string s = R”String \\\“int”;' - 但是您的模式处理单引号和您的示例字符串有双引号。 –
@Gurman号字符串'“字符串”字符串“'是不可接受的,但你的正则表达式接受。 – Ali94
@WiktorStribiżew我的例子只是显示在控制台中出现的内容,我的意思是你的代码意味着什么(也编辑我的正则表达式这是我的错误。) – Ali94