2015-06-16 62 views
1

我想解析字符串列表,如果他们匹配的正则表达式表达(含团体),如果是的话,重组的团体,以一个新的字符串。正则表达式:重组匹配组到新的字符串

说我有文件,就像

file_1.csv 
file_2a.csv 
file_3.csv 

使用(文件)_(\ d)的.csv我可以匹配第一和最后只,没问题。现在

我的目标是在一个新的秩序又重新组装组。我想提供类似$ 2 $ 1.csv,给我

1file.csv 
3file.csv 

难道这也是在正则表达式级框架提供的方法的一部分?或者是我需要解析自己的东西?我无法找到一种方法,我可以提供带有组号码的字符串并获得我的结果。


RegEx.Replace不是我正在寻找的功能,我认为?或者是? 我可以将$ 2 $ 1作为替代品,它实际上提供了我所需要的。
但是,这只能如果模式整个表达式匹配(和替换“开始于空字符串”)
此外,我需要先检查使用.IsMatch(...),如果它是一个有效的文件,以配合首先,因为否则替换不匹配,并返回1:1的原始表达式。
我想我要寻找一个方法上,我使用匹配收集由RegEx.Match交付和“应用”组信息,以新的模式串“$ 1 $ 2 $ 3”

感谢框架!

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

+0

什么是有效的文件?maatch会是什么? – vks

+0

有效文件都是那些与提供的模式匹配的文件(在本例中是第一个和最后一个)。布尔System.Text.RegularExpression.Regex.IsMatch(字符串模式,字符串表达式)是一种静态方法来传递如果...它是否匹配。 – Ralf

+0

你真的希望忽略来自同一个进程的file_2a.csv吗? – Shar1er80

回答

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 
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

+0

删除屏幕截图,很难看..我们可以相信,代码有你建议作为文本答案的结果。 – OmegaMan

0

使用的提取/替换捕捉这里有一个例子(注意,使用.dump用于通过Linqpad显示实例的当前状态示例中使用结果如下)

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

我把它留给你的扩展匹配,但是这显示了如何做到这一点。

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); 

我希望这有助于一些人寻找这个(这是很多更灵活)