1

我有大约 100 个文件需要替换:

  1. Eval("something") 与 Eval("something").ToEncodedString()
  2. Eval("something").ToString() 与 Eval("something").ToEncodedString()

我正在编写一个可以自动执行此操作的小型 C# 应用程序。但无法形成正则表达式。有人会帮我吗?

4

1 回答 1

2

您可以使用此模式:@"\bEval\(""(?<Value>.+?)""\)(?:\.ToString\(\))?"

分解:

  • \bEval: 匹配单词边界以确保我们将“Eval”作为一个完整的单词而不是另一个单词的一部分进行匹配
  • \("":文字左括号和双引号(双引号出现两次,因为这是使用逐字字符串文字时它们被转义的方式,即字符串前面的@符号)
  • (?<Value>.+?):命名为“Value”的捕获组,它是任何字符的非贪婪匹配(将在双引号处停止)
  • ""\): 右双引号和右括号
  • (?:\.ToString\(\))?: 该(?:...)位是一个非捕获组,然后我们.ToString()用适当的转义字面匹配,最后?使这个组可选

替换模式是@"Eval(""${Value}"").ToEncodedString()",很容易理解。重要的部分是命名的捕获组“值”是通过使用引用的${Value}

示例代码:

string[] inputs = 
{
    @"Eval(""something"")",
    @"Eval(""hello"").ToString()"
};

string pattern = @"\bEval\(""(?<Value>.+?)""\)(?:\.ToString\(\))?";
string replacement = @"Eval(""${Value}"").ToEncodedString()";

foreach (var input in inputs)
{
    Console.WriteLine(Regex.Replace(input, pattern, replacement));
}
于 2012-06-27T17:03:52.950 回答