如何以有效的方式在同一个字符串上应用多个正则表达式?

时间:2013-11-05 16:46:44

标签: c# regex

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

有更好的方法吗?

2 个答案:

答案 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更快。是的,你做了两次循环,但你在每个角色做了一半的工作,所以到第一次近似它是一个洗。当然,如果它很重要,那就无法用实际数据进行测量。