你好我有一个C#字符串,我需要匹配多个模式,如果找到它们就删除它们。
我做了这个并且有效:
sede.Address = Regex.Replace(sede.Address, @"^(?i)str\.*", "Strada");
sede.Address = Regex.Replace(sede.Address, @"^(?i)fraz\.*", "Frazione");
sede.Address = Regex.Replace(sede.Address, @"^[^vV]\.*\w{2}\s", "");
sede.Address = Regex.Replace(sede.Address, @"\w+\.\w*", "");
有更好的方法吗?
答案 0 :(得分:1)
另一种更好的方法来做你想要的是组合所有的模式,做一些Matches
来获得所有匹配的集合,循环遍历这个集合并找到确切的模式然后执行相应的替换:
Dictionary<string,string> subPatterns = new Dictionary<string,string>();
subPatterns[@"^(?i)str\.*"] = "Strada";
subPatterns[@"^(?i)fraz\.*"] = "Frazione";
subPatterns[@"^(?-i)[^vV]\.*\w{2}\s|\w+\.\w*"] = "";
//build the compositing pattern from sub patterns
string pattern = string.Join("|", subPatterns.Select(e=>e.Key));
//replace it
StringBuilder address = new StringBuilder();
int nextStart = 0;
foreach(Match m in Regex.Matches(sede.Address, pattern)){
if(m.Success){
address.Append(sede.Address.Substring(nextStart,m.Index));
//find the replacement
foreach(var pat in subPatterns){
if(Regex.IsMatch(m.Value,pat.Key)){
address.Append(pat.Value);
break;
}
}
nextStart = m.Index + m.Length;
}
}
sede.Address = address.ToString();
注意:上面的代码当然比原始代码更好(因为匹配只在循环中通过输入中的所有字符完成一次)。但它仅适用于您的替换是独立的,否则您必须保留原始代码。
答案 1 :(得分:1)
唯一简单的改进是编译正则表达式并将它们存储起来以便重用,而不是每次都创建新的正则表达式。组合备用模式会使代码更难阅读。在大多数正则表达式实现中,正则表达式a|b
并不比应用a
和应用b
更快。是的,你做了两次循环,但你在每个角色做了一半的工作,所以到第一次近似它是一个洗。当然,如果它很重要,那就无法用实际数据进行测量。