我想解析一个字符串列表,如果它们匹配一个RegEx表达式(带有组),如果匹配,则将这些组重新组合成一个新的字符串。
说我有像
这样的文件file_1.csv
file_2a.csv
file_3.csv
使用(文件)_(\ d).csv我可以匹配第一个也是最后一个,没问题。
现在我的目标是以新的顺序重新组装组。我想提供$ 2 $ 1.csv,给我
1file.csv
3file.csv
这也是框架的RegEx类中提供的方法的一部分吗?还是我需要解析自己的东西?我无法找到一种方法,我可以使用组号提供字符串并返回结果。
<小时/> RegEx.Replace不是我想要的功能吗?或者是吗? 我可以投入2美元1美元作为替代品,它实际上提供了我所需要的。
谢谢!
*编辑:正则表达式模式以及重组模式需要是动态的并且是用户提供的。显然他们需要相互兼容。
答案 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]);
}
答案 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的输出:
我在匹配扩展程序时将其留给您,但这显示了如何执行此操作。
答案 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);
我希望这可以帮助一些人搜索这个(它更灵活)