如何在字符串中每组出现的分隔符之间替换所有特殊字符的实例?

时间:2017-02-14 23:01:57

标签: c# regex

我正在尝试在字符串中每组出现的分隔符之间替换所有特殊字符的实例。我相信该解决方案将包含一些正则表达式 match 的组合,以检索每组分隔符之间的文本和正则表达式 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 ]?";

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

显然这不起作用,因为我无法分配循环内的匹配值,但我希望你能按照我的思考过程。重要的是,不在分隔符之间的任何字符保持不变。任何指导或建议都会有所帮助。非常感谢你!

1 个答案:

答案 0 :(得分: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*是文字字符串,您可以在模式中使用单个捕获组,然后将这些分隔符添加为匹配评估程序中的硬编码,但它取决于你决定什么最适合你。