如何检查字符串是否包含超过50个字符的单词?

时间:2011-04-22 21:09:11

标签: c# asp.net

如何检查字符串是否包含超过50个字符的单词?

4 个答案:

答案 0 :(得分:6)

EG。与LINQ:

string toCheck = "your string here";
bool isLong = toCheck
    .Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
    .Any(s => s.Length > 50);

修改

出于好奇,人们怀疑正则表达式会更快(我也这么认为),我做了几个简单的测试。不得不承认我对结果感到惊讶:

LINQ(或者说,字符串.Split和LINQ)的执行速度似乎比编译的Regex高3-20倍,比未编译的版本快6-30倍。

我在1'000'000模式下运行每个解决方案的Release次迭代,检查4个示例字符串:

  • 一个没有50个字符+长字
  • 一个只有一个50个字符+长字,位于字符串的结尾
  • 一个只有一个50个字符+长字,在字符串的开头
  • 一个有多个50个字符+长字,一个遍布字符串

结果可以在这里看到(LINQ vs编译正则表达式):

  

LINQ [noLongWords],1000000次迭代。结果=错误:867毫秒

     

LINQ [oneLongWordAtEnd],1000000次迭代。结果=真:986毫秒

     

LINQ [oneLongWordAtBegining],1000000次迭代。结果=真:827毫秒

     

LINQ [manyLongWordsEverywhere],1000000次迭代。结果=真:2399毫秒

     

正则表达式[noLongWords],1000000次迭代。结果=错误:16714毫秒

     

Regex [oneLongWordAtEnd],1000000次迭代。结果=真:14225毫秒

     

Regex [oneLongWordAtBegining],1000000次迭代。结果=真:6483毫秒

     

Regex [manyLongWordsEverywhere],1000000次迭代。结果=真:6675毫秒

测试的源代码可用here

当然,在常规条件下(谁运行1'000'000次迭代?),差异无关紧要,应该采用更容易/更易维护的解决方案。

答案 1 :(得分:5)

强制性正则表达式回答:

Regex re = new Regex(@"(\w){50,}");
re.IsMatch(input);
PS:虽然我倾向于远离正则表达式,但我认为在这种情况下,正则表达式更简单,更快。

@ jimmy_keen实验后编辑

@jimmy_keen - 谢谢你。

我删除了该组,因为它不是真正需要的,并且Regex所花费的时间要少得多,下面是编译的输出:

更改了正则表达式:

Regex regex = new Regex(@"\w{50,}", RegexOptions.Compiled);

输出:

  

LINQ [noLongWords],1000000   迭代。结果=错误:725毫秒

     

LINQ [oneLongWordAtEnd],1000000   迭代。结果=真:760毫秒

     

LINQ [oneLongWordAtBegining],1000000   迭代。结果=真:651毫秒

     

LINQ [manyLongWordsEverywhere],   1000000次迭代。 Result = True:   2107毫秒

     

正则表达式[noLongWords],1000000   迭代。结果=错误:2773毫秒

     

Regex [oneLongWordAtEnd],1000000   迭代。结果=真:7217毫秒

     

Regex [oneLongWordAtBegining],1000000   迭代。结果=真:3279毫秒

     

Regex [manyLongWordsEverywhere],   1000000次迭代。 Result = True:   3283毫秒

     

DONE

在这种情况下,正则表达式比LINQ慢,但有点令人惊讶,但也许不是,因为我已经多次被正则表达式烧毁了。它们是一个很好的工具,但很重。在这种情况下,我认为正则表达式能够略微领先于LINQ,但事实并非如此。

稍微复杂一点,但类似的正则表达式在许多长字案例中胜过LINQ:

Regex regex = new Regex(@"[A-Za-z0-9]{50,}", RegexOptions.Compiled);
  

LINQ [noLongWords],1000000   迭代。结果=错误:611毫秒

     

LINQ [oneLongWordAtEnd],1000000   迭代。结果=真:642毫秒

     

LINQ   [oneLongWordAtBegining],1000000   迭代。结果=真:549毫秒

     

LINQ   [manyLongWordsEverywhere],1000000   迭代。结果=真:1914毫秒

     

正则表达式[noLongWords],1000000   迭代。结果=错误:2085毫秒

     

Regex [oneLongWordAtEnd],1000000   迭代。结果=真:4147毫秒

     

Regex [oneLongWordAtBegining],1000000   迭代。结果=真:1569毫秒

     

Regex [manyLongWordsEverywhere],   1000000次迭代。 Result = True:   1580毫秒

     

DONE

但我仍然相信正则表达式的简单性以及性能差异开始出现在100,000次或更多次,正则表达式仍然是最佳解决方案

答案 2 :(得分:2)

取决于你想要寻找的标点符号,但基本上是:

string input = "fox jumped over the fence.";
bool hasLongWord = input.Split(new[] { ' ', ';', '.' }, 
                               StringSplitOptions.RemoveEmptyEntries)
                        .Any(word => word.Length > 50);

答案 3 :(得分:0)

错误......我认为你找不到比以下更快的东西:

private static Regex rxLongWord = new Regex( @"\w{50,}" ) ;
public HasLongWord( string s )
{
  bool foundLongWord = rxLongWord.IsMatch( s ) ;
  return foundLongWord ;
}