匹配和替换函数表达式

时间:2016-05-19 04:03:51

标签: c# regex parsing backreference

我需要对C#进行一些非常简单的解析(实际上是transpiled Razor code)来替换带有文本替换的函数调用列表。

如果给定包含{"Foo.myFunc" : "\"def\"" }的集合,则应替换此代码:

var res = "abc" + Foo.myFunc(foo, Bar.otherFunc( Baz.funk()));

用这个:

var res = "abc" + "def"

我不关心嵌套表达式。

这看起来相当简单,我认为我应该能够避免为映射集的每个成员使用类似的东西构建一个完整的C#解析器:

  • 查找表达式开始(例如Foo.myFunc
  • Push() / Pop()括号Stack直到Count == 0
  • 将此标记为表达式停止
  • 将所有内容从表达式开始替换为表达式停止

但也许我不需要......是否有一个(可能是内置的).NET库可以为我做这个?在RE所使用的语言系列中无法进行计数,但C#中的扩展正则表达式语法是否可以使用反向引用以某种方式处理它?<​​/ p>

修改 正如对this answer的评论所示,简单地计算括号通常是不够的,因为像trollMe("(")这样的东西会抛弃这些算法。那么只有真正的解析就足够了,我想(?)。

1 个答案:

答案 0 :(得分:2)

普通字符串的技巧是:

(?>"(\\"|[^"])*")

逐字字符串:

(?>@"(""|[^"])*")

也许这会有所帮助,但我不确定这会在所有情况下都有效:

<func>(?=\()((?>/\*.*?\*/)|(?>@"(""|[^"])*")|(?>"(\\"|[^"])*")|\r?\n|[^()"]|(?<open>\()|(?<-open>\)))+?(?(open)(?!))

<func>替换为您的函数名称。

无言之地说trollMe("\"(", "((", @"abc""de((f")按预期工作。

DEMO