我正在编写一个cpp程序,它是一个类似cpp语言的词法分析器。为了找到每个令牌,我使用正则表达式进行匹配,然后决定选择正确的令牌。
这种语言的字符串与cpp完全相同。我使用的正则表达式是这样的:
\"([^\\\"]|\\.)?\"
但这不是真的正确。对于这样的输入:
"String \" int"
输出应该是一个字符串标记,但是使用我的正则表达式,我得到一个字符串标记(" String")和一个int关键字,然后出错。
你知道如何处理这个问题吗?或者我该如何更改正则表达式?
P.S。 :我使用regex_search()来查找匹配。
谢谢。
答案 0 :(得分:1)
您可以使用
std::regex rx(R"(\"[^\"\\]*(?:\\.[^\"\\]*)*\")");
模式为"[^"\\]*(?:\\.[^"\\]*)*"
:
"
- 双引号[^"\\]*
- 除了双引号和反斜杠之外的零个或多个字符(?:\\.[^"\\]*)*
- 零次或多次重复
\\.
- 前面有反斜杠的任何字符(如果您还需要支持转义换行符,请将.
替换为[\s\S]
)[^"\\]*
- 除了双引号和反斜杠之外的零个或多个字符"
- 双引号。请参阅regex demo。