正则表达式取代内部

8 c# regex

好吧,我有这个代码:

        StreamReader sr = new StreamReader(@"main.cl", true);
        String str = sr.ReadToEnd();
        Regex r = new Regex(@"&");
        string[] line = r.Split(str);

        foreach (string val in line)
        {
            string Change = val.Replace("puts","System.Console.WriteLine()");
            Console.Write(Change);
        }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我正在尝试替换puts(内容),Console.WriteLine(content)但它需要正则表达式,我没有找到关于如何做这篇文章的好文章.

基本上,把*作为即将到来的价值,我想这样做:

string Change = val.Replace("puts *","System.Console.WriteLine(*)");
Run Code Online (Sandbox Code Playgroud)

然后,如果我收到:

puts "Hello World";
Run Code Online (Sandbox Code Playgroud)

我想得到:

System.Console.WriteLine("Hello World");
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 12

您需要使用捕获组Regex.Replace来捕获部分输入,并将捕获的匹配包含在输出中.例:

Regex.Replace(
    "puts 'foo'",                    // input
    "puts (.*)",                     // .* means "any number of characters"
    "System.Console.WriteLine($1)")  // $1 stands for whatever (.*) matched
Run Code Online (Sandbox Code Playgroud)

如果输入始终以分号结尾,则您希望将分号移到WriteLineparens 之外.一种方法是:

Regex.Replace(
    "puts 'foo';",                   // input
    "puts (.*);",                    // ; outside parens -- now it's not captured
    "System.Console.WriteLine($1);") // manually adding the fixed ; at the end
Run Code Online (Sandbox Code Playgroud)

如果您打算调整这些示例,最好首先查阅技术参考; 你可以在这里找到一个非常好的.

  • 您的评论接近正确,但略有误导.`.``表示匹配任何字符(我想甚至可能是任何非新行字符)0次或更多次.`$ 1`代表`(.*)`匹配的东西.可能看起来像挑剔,但如果@MarceloCamargo要学会制作自己的正则表达式,理解这些区别将是至关重要的. (2认同)

Zac*_*bel 10

您要做的是查看分组表达式.尝试以下内容

Regex.Replace(val, "puts (.*);", "System.Console.WriteLine(${1});");
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以为组命名,而不是使用其索引进行替换.你可以这样做:

Regex.Replace(val, "puts (?<str>.*);", "System.Console.WriteLine(${str});");
Run Code Online (Sandbox Code Playgroud)