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