2017-02-14 58 views
2

我试图在每个字符串中的一组分隔符之间替换所有特殊字符的所有实例。我相信解决方案将包括正则表达式匹配的一些组合,以检索每组分隔符和正则表达式之间的文本替换以用空格替换匹配内的每个违规字符。这是我到目前为止有:如何替换字符串中每组分隔符之间的任何特殊字符的所有实例?

string input = "***XX*123456789~N3*123 E. Fake St. Apt# 456~N4*Beverly Hills*CA*902122405~REF*EI*902122405~HL*1*1*50*0~SBR*P*18*******MA~NM1*IL*1*Tom*Thompson*T***MI*123456789A~N3*456 W. False Ave.*Apt. #6B~N4*Beverly Hills*CA*90210~DMG*"; 
string matchPattern = "(~N3\\*)(.*?)(~N4\\*)"; 
string replacePattern = "[^0-9a-zA-Z ]?"; 

var matches = Regex.Matches(input, matchPattern); 
foreach (Match match in matches) 
{ 
    match.Value = "~N3*" + Regex.Replace(match.Value, replacePattern, " ") + "~N4*"; 
} 

MessageBox.Show(input); 

我期望的消息框,显示以下内容:

"***XX*123456789~N3*123 E Fake St Apt 456~N4*Beverly Hills*CA*902122405~REF*EI*902122405~HL*1*1*50*0~SBR*P*18*******MA~NM1*IL*1*Tom*Thompson*T***MI*123456789A~N3*456 W False Ave *Apt 6B~N4*Beverly Hills*CA*90210~DMG*" 

显然,这是行不通的,因为我不能分配给内部的匹配值循环,但我希望你可以按照我的思维过程。任何不在分隔符之间的字符保持不变是很重要的。任何方向或建议都会有帮助。非常感谢!

回答

0

使用Regex.Replace与匹配评价,您可以拨打第二个Regex.Replace

string input = "***XX*123456789~N3*123 E. Fake St. Apt# 456~N4*Beverly Hills*CA*902122405~REF*EI*902122405~HL*1*1*50*0~SBR*P*18*******MA~NM1*IL*1*Tom*Thompson*T***MI*123456789A~N3*456 W. False Ave.*Apt. #6B~N4*Beverly Hills*CA*90210~DMG*"; 
string matchPattern = @"(~N3\*)(.*?)(~N4\*)"; 
string replacePattern = "[^0-9a-zA-Z ]"; 

string res = Regex.Replace(input, matchPattern, m => 
     string.Format("{0}{1}{2}", 
     m.Groups[1].Value, 
     Regex.Replace(m.Groups[2].Value, replacePattern, " "), // Here, you modify just inside the 1st regex matches 
     m.Groups[3].Value)); 
Console.Write(res); // Just to print the demo result 
// => ***XX*123456789~N3*123 E Fake St Apt 456~N4*Beverly Hills*CA*902122405~REF*EI*902122405~HL*1*1*50*0~SBR*P*18*******MA~NM1*IL*1*Tom*Thompson*T***MI*123456789A~N3*456 W False Ave Apt 6B~N4*Beverly Hills*CA*90210~DMG* 

C# demo

实际上,因为~N3*~N4*是文字字符串,你可以使用一个捕获组然后将这些分隔符作为硬编码添加到匹配评估程序中,但是由您决定最适合您的是什么。

+0

这正是我所期待的!非常感谢! –

相关问题