如何从C#中清晰地从唯一项列表中依次执行多个Regex替换

问题描述 投票:0回答:1

我正在尝试寻找一种更干净的方法来对单个字符串执行多个顺序替换,其中每个替换都具有唯一的模式和字符串替换。

例如,如果我有3对模式替换字符串:

1. /(?<!\\)\\n/, "\n"

2. /(\\)(?=[\;\:\,])/, ""

3. /(\\{2})/, "\\"

我想将正则表达式替换1应用于原始字符串,然后将2应用于输出1,依此类推,依此类推。

以下控制台程序示例完全可以实现我想要的功能,但是它有很多重复之处,我正在寻找一种更干净的方法来执行相同的操作。

SanitizeString

static public string SanitizeString(string param)
{
    string retval = param;
    //first replacement
    Regex SanitizePattern = new Regex(@"([\\\;\:\,])");
    retval = SanitizePattern.Replace(retval, @"\$1");

    //second replacement
    SanitizePattern = new Regex(@"\r\n?|\n");
    retval = SanitizePattern.Replace(retval, @"\n");

    return retval;
}

ParseCommands

static public string ParseCommands(string param)
{
    string retval = param;
    //first replacement
    Regex SanitizePattern = new Regex(@"(?<!\\)\\n");
    retval = SanitizePattern.Replace(retval, System.Environment.NewLine);

    //second replacement
    SanitizePattern = new Regex(@"(\\)(?=[\;\:\,])");
    retval = SanitizePattern.Replace(retval, "");

    //third replacement
    SanitizePattern = new Regex(@"(\\{2})");
    retval = SanitizePattern.Replace(retval, @"\");

    return retval;
}

Main

using System;
using System.IO;
using System.Text.RegularExpressions;

...

static void Main(string[] args)
{
    //read text that contains user input
    string sampleText = File.ReadAllText(@"c:\sample.txt");

    //sanitize input with certain rules
    sampleText = SanitizeString(sampleText);
    File.WriteAllText(@"c:\sanitized.txt", sampleText);

    //parses escaped characters back into the original text
    sampleText = ParseCommands(sampleText);
    File.WriteAllText(@"c:\parsed_back.txt", sampleText);
}

不介意文件操作。我只是将其用作可视化实际输出的快速方法。在我的程序中,我将使用其他内容。

c# regex refactoring
1个回答
0
投票

这里是一种方式:

var replacements = new List<(Regex regex, string replacement)>()
{
    (new Regex(@"(?<!\\)\\n"), System.Environment.NewLine),
    (new Regex(@"(\\)(?=[\;\:\,])"), ""),
    (new Regex(@"(\\{2})"), @"\"),
};

理想情况下将其缓存在静态只读字段中:

然后:

foreach (var (regex, replacement) in replacements)
{
    retval = regex.Replace(retval, replacement);
}
© www.soinside.com 2019 - 2024. All rights reserved.