如何使用正则表达式(词法分析)表达类似cpp的字符串(词法分析)

如何使用正则表达式(词法分析)表达类似cpp的字符串(词法分析)

问题描述:

我正在写一个cpp程序,它是一个类似于cpp的语言的词法分析器。为了找到每个标记,我使用正则表达式来匹配,然后决定选择正确的标记。如何使用正则表达式(词法分析)表达类似cpp的字符串(词法分析)

这种语言的字符串和cpp完全一样。我使用的正则表达式是这样的:

\"([^\\\"]|\\.)?\" 

但它不是真的正确。对于这样的输入:

"String \" int" 

输出应该是一个字符串标记,但我的正则表达式,我得到一个字符串标记(“字符串”)和一个int关键字,然后一个错误。

你有什么想法如何处理?或者我应该如何改变正则表达式?

P.S. :我使用regex_search()来查找匹配。

谢谢。

+0

'“String \”int“'字符串常量不包含'''char。使用'string s = R”String \\\“int”;' - 但是您的模式处理单引号和您的示例字符串有双引号。 –

+0

@Gurman号字符串'“字符串”字符串“'是不可接受的,但你的正则表达式接受。 – Ali94

+0

@WiktorStribiżew我的例子只是显示在控制台中出现的内容,我的意思是你的代码意味着什么(也编辑我的正则表达式这是我的错误。) – Ali94

您可以使用

std::regex rx(R"(\"[^\"\\]*(?:\\.[^\"\\]*)*\")"); 

模式是"[^"\\]*(?:\\.[^"\\]*)*"

  • " - 一个双引号
  • [^"\\]* - 零个或多个字符不是一个双引号和反斜线
  • (?:\\.[^"\\]*)*其他 - 零次或多次重复的
    • \\. - 在前面一个反斜杠任何字符(与[\s\S],如果你需要更换.也支持逃脱换行符)
    • [^"\\]* - 零个或多个字符不是一个双引号和反斜线
  • 其他
  • " - 双引号。

查看regex demo