2

您好,我有一个 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*", "");

有一个更好的方法吗?

4

2 回答 2

1

唯一简单的改进是编译正则表达式并存储它们以供重用,而不是每次都创建新的。组合交替模式使代码更难阅读。在大多数正则表达式实现中,正则表达式a|b并不比应用a和应用快b。是的,你确实循环了两次,但你在每个角色上做了一半的工作,所以第一个近似值是一个洗涤。当然,如果它很重要,那么用真实世界的数据进行测量是无可替代的。

于 2013-11-05T19:04:24.963 回答
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();

注意:上面的代码当然比您的原始代码更好(因为匹配只在循环中通过输入中的所有字符完成一次)。但它仅适用于您的替换是独立的,否则您必须保留原始代码。

于 2013-11-05T18:51:23.507 回答