我需要对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("(")
这样的东西会抛弃这些算法。那么只有真正的解析就足够了,我想(?)。
答案 0 :(得分:2)
普通字符串的技巧是:
(?>"(\\"|[^"])*")
逐字字符串:
(?>@"(""|[^"])*")
也许这会有所帮助,但我不确定这会在所有情况下都有效:
<func>(?=\()((?>/\*.*?\*/)|(?>@"(""|[^"])*")|(?>"(\\"|[^"])*")|\r?\n|[^()"]|(?<open>\()|(?<-open>\)))+?(?(open)(?!))
将<func>
替换为您的函数名称。
无言之地说trollMe("\"(", "((", @"abc""de((f")
按预期工作。