RegEx:将匹配的组重组为新字符串

时间:2015-06-16 09:21:54

标签: c# regex

我想解析一个字符串列表,如果它们匹配一个RegEx表达式(带有组),如果匹配,则将这些组重新组合成一个新的字符串。

说我有像

这样的文件
file_1.csv
file_2a.csv
file_3.csv

使用(文件)_(\ d).csv我可以匹配第一个也是最后一个,没问题。

现在我的目标是以新的顺序重新组装组。我想提供$ 2 $ 1.csv,给我

1file.csv
3file.csv

这也是框架的RegEx类中提供的方法的一部分吗?还是我需要解析自己的东西?我无法找到一种方法,我可以使用组号提供字符串并返回结果。

<小时/> RegEx.Replace不是我想要的功能吗?或者是吗? 我可以投入2美元1美元作为替代品,它实际上提供了我所需要的。
但这只有在模式匹配整个表达式时才有效(并替换“在空字符串上开始”)
另外,我需要首先检查使用.IsMatch(...),如果它是一个首先匹配的有效文件,因为否则替换匹配任何内容并以原始表达式返回1:1。 我想我正在寻找框架上的方法,我使用RegEx.Match提供的Match-collection并将组信息“应用”到新的模式字符串“$ 1 $ 2 $ 3”

谢谢!

*编辑:正则表达式模式以及重组模式需要是动态的并且是用户提供的。显然他们需要相互兼容。

4 个答案:

答案 0 :(得分:2)

这是我的方法。我调整了您的正则表达式和替换字符串以包含文件扩展名。

var files = new List<string> { "file_1.csv", "file_2a.csv", "file_3.csv" };
var regex = new Regex("(file)_(\\d)(.csv)");
var replacement = "$2$1$3";

foreach (var f in files ){
    if (regex.IsMatch(f)){
        Console.WriteLine( regex.Replace(f, replacement ) );
    }
}

产地:

1file.csv
3file.csv

答案 1 :(得分:0)

    string[] fileNames = { "file_1.csv", "file_2a.csv", "file_3.csv" };            
    string[] newFileNames = fileNames.Where(f => Regex.IsMatch(f, @"^(file)_(\d)\.csv$")).ToArray();
    for (int i = 0; i < newFileNames.Length; i++)
    {
        string[] temp = newFileNames[i].Split('.');
        newFileNames[i] = temp[0].Replace("file_", "") + "file.csv";
        Console.WriteLine(newFileNames[i]);
    }

Screenshot

答案 2 :(得分:0)

使用命名匹配捕获进行提取/替换是一个示例(请注意,Linqpad使用.Dump来显示下面示例结果中使用的实例的当前状态

string text = @"file1.csv";

var pattern = @"(?<FileName>[^\d_]+)(?:_?)(?<Number>[^.]+).csv";

var parts = Regex.Matches(text, pattern)
                 .OfType<Match>()
                 .Select (mt => new
                 {
                    Name = mt.Groups["FileName"].Value,
                    Num  = mt.Groups["Number"].Value
                 }).Dump();


Regex.Replace(text, pattern, "${Number}${FileName}.csv").Dump();

这是转储的结果,第一个是动态实体,有两个Name和Num字段,第二个是Regex.Replace的输出:

Results of the Dump calls

我在匹配扩展程序时将其留给您,但这显示了如何执行此操作。

答案 3 :(得分:0)

我遇到了类似的问题,我找到了一个对我来说非常优雅的解决方案。 您必须使用C#String.format样式。

请注意,此代码仅适用于单个替换(循环丢失)(但符合标题)

string in = "file_1.csv",
  regex = "(file)_(\d).csv",
  template = "{2}{1}.csv";

// get group content of first match as string array
string[] groups = Regex.Matches(in, regex)[0].Groups.Cast<Group>().Select(o => o.Value).ToArray();
// format according to template
string result = String.Format(template, groups);

我希望这可以帮助一些人搜索这个(它更灵活)