1

假设我们有字符串ONE|(TWO|(THREE|FOUR))......
知道 std::regex支持递归,我们如何将这个字符串分解为字符串的 std::vector,其中(按顺序)包含:

  • THREE|FOUR
  • TWO|{0}
  • ONE|{1}

以上述方式转换 this 的目的是创建一个可遍历的表达式列表,该列表应在语义上表示嵌套的 if/then 语句。如何做到这一点?

4

2 回答 2

2

使用正则表达式库进行词法分析是一种可怕的方式来处理任何不平凡的事情。当您找到匹配项时,如果不进行一些后期处理,您将不会知道匹配的内容。如果您不想使用第三方库,那么您需要认真问自己是否要为初学者编写自己的词法分析器生成器。如果您想这样做,我很乐意为您提供建议。

一旦你有可靠的词法分析工作,你会发现下一部分要容易得多。然后,您可以编写一个临时解析器或继续编写您自己的解析器生成器。

于 2013-03-17T13:42:05.647 回答
1

由于您首先想要最内部的内容,因此您可以利用惰性/不贪婪的 RegEx 行为并将所有内容匹配到 a )with(.*?)\)或除圆括号之外的所有内容 with \([^\)\(]+

伪代码:

while ( regex_match(string, regex) ) {
    add matches to vector
    replace matches in string with vector index in curly brackets
}

((?:\(|^)[^\)\(]+(?:\)|$))
正则表达式示例:正则表达式演示:http : //regex101.com/r/pJ4pO7

于 2013-03-17T01:52:14.267 回答