现有数组 string[] s={a,b,c,d,....} 共10000个元素。
有字符串 string str="s435t4gfh5686g53415648643215637156785571d....."
只要数组中有一个元素能够在str中匹配到就算匹配成功
我是用
for(int i=0;i<s.length;i++)
{
 Regex reg=gex(s[i]);
Match mac = reg.Match(str);
if(mac.Success)
break;
}
息率高呢还是用
string strreg="";
for(int i=0;i<s.length;i++)
{
strreg+=s[i]+"|";
}
Regex reg=gex(strreg);
Match mac = reg.Match(str);
if(mac.Success)上面两种执行效率哪个高?最好有原因。

解决方案 »

  1.   

    只要数组中有一个元素能够在str中匹配到就算匹配成功?感觉还不如遍历一遍数组,然后用IndexOf来判断呢,这样才O(n)
      

  2.   

    显然是后者。但拼接的时候要注意,这样写不行的。要注意可能有转义字符。
    StringBuilder regexBuilder = new StringBuilder();
    regexBuilder.Append("(?>");//整体捕获,也叫原子组。
    foreach (string item in s)
    {
        regexBuilder.Append(Regex.Escape(item)+"|");
    }
    regexBuilder.Remove(regexBuilder.Length-1,1);//去掉最后一个|
    regexBuilder.Append(")");
    Regex reg = new Regex(regexBuilder.ToString(), RegexOptions.Compiled);
    Match mac = reg.Match(str);
    if (mac.Success)
      

  3.   

    感觉是不可靠的。要量化为时间。
    完全是你的写法,只是用stringbuilder来优化多个string的拼接,如果按你说的关键词很多,那用stringbuilder是肯定会快的,匹配的时候,这个做法和你的做法一模一样,只是你写的是错的,最后多一个|,而且你的没考虑如果关键字中包含正则表达式的情况,比如有个关键字是\d。