用C ++ [std :: regex]替换表达式的内容

时间:2013-03-17 00:05:41

标签: c++ regex string replace semantics

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

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

以前面的方式转换它的目的是创建一个可遍历的表达式列表,它应该在语义上表示嵌套的if / then语句。如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

使用正则表达式库来执行lexing是一种非常糟糕的方式。当你得到一个匹配时,如果没有一些后期处理,你就不会知道匹配了什么。如果您不想使用第三方库,那么您需要认真问自己是否要为初学者编写自己的词法分析器生成器。如果你想这样做,我很乐意给你提示。

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

答案 1 :(得分:1)

由于您首先需要内部最多的内容,因此您可以使用lazy / ungreedy RegEx行为,并将所有内容与) (.*?)\)\([^\)\(]+的所有内容进行匹配。< / p>

伪代码:

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

示例RegEx:((?:\(|^)[^\)\(]+(?:\)|$))
这里的RegEx演示:http://regex101.com/r/pJ4pO7