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

本文关键字:包含超 50个 字符 单词 是否 字符串 何检查 检查 | 更新日期: 2023-09-27 17:51:26

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

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

LINQ:

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

编辑

出于好奇,人们怀疑Regex会更快(我也这么认为),我运行了一些简单的测试。不得不承认我对结果感到惊讶:

LINQ(或者更准确地说,是string。Split和LINQ)似乎比编译后的Regex快3-20倍,比未编译的Regex快6-30倍。

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

  • 无50字符+长单词
  • 一个在字符串
  • 结尾处恰好有一个50个字符+长的单词的
  • 在字符串
  • 开头的处包含一个50个字符+长的单词。
  • 一个包含多个50个字符+长的单词,围绕字符串
  • 展开

结果可以在这里看到(LINQ vs编译的regex):

LINQ [noLongWords], 1000000次迭代。结果= False: 867 ms

LINQ [oneLongWordAtEnd], 1000000次迭代。结果= True: 986 ms

LINQ [oneLongWordAtBegining], 1000000次迭代。结果= True: 827 ms

LINQ [manylongwordeveryywhere], 1000000次迭代。结果= True: 2399 ms

Regex [noLongWords], 1000000次迭代。结果= False: 16714 ms

Regex [oneLongWordAtEnd], 1000000次迭代。结果= True: 14225 ms

Regex [oneLongWordAtBegining], 1000000次迭代。结果= True: 6483 ms

Regex [manyLongWordsEverywhere], 1000000次迭代。结果= True: 6675 ms

测试的源代码在这里。

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

必须的正则表达式答案:

Regex re = new Regex(@"('w){50,}");
re.IsMatch(input);

PS:虽然我倾向于远离Regex,但我觉得在这种情况下,Regex更简单,更快。

@jimmy_keen实验后编辑

@jimmy_keen -谢谢。

我删除了这个组,因为它并不是真的需要,而且对于Regex来说花费的时间要少得多,下面是编译后的输出:

改变正则表达式:

Regex regex = new Regex(@"'w{50,}", RegexOptions.Compiled);
输出:

LINQ [noLongWords], 1000000迭代。结果= False: 725 ms

LINQ [oneLongWordAtEnd], 1000000迭代。结果= True: 760 ms

LINQ [oneLongWordAtBegining], 1000000迭代。结果= True: 651 ms

LINQ (manyLongWordsEverywhere),1000000的迭代。结果= True:2107 ms

Regex [noLongWords], 1000000迭代。结果= False: 2773 ms

Regex [oneLongWordAtEnd], 1000000迭代。结果= True: 7217 ms

Regex [oneLongWordAtBegining], 1000000迭代。结果= True: 3279 ms

Regex (manyLongWordsEverywhere),1000000的迭代。结果= True:3283 ms

完成

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

一个稍微复杂但相似的regex在许多长单词情况下优于LINQ:

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

LINQ [noLongWords], 1000000迭代。结果= False: 611 ms

LINQ [oneLongWordAtEnd], 1000000迭代。结果= True: 642 ms

LINQ[oneLongWordAtBegining], 1000000迭代。结果= True: 549 ms

LINQ[manyLongWordsEverywhere], 1000000迭代。结果= True: 1914 ms

Regex [noLongWords], 1000000迭代。结果= False: 2085 ms

Regex [oneLongWordAtEnd], 1000000迭代。结果= True: 4147 ms

Regex [oneLongWordAtBegining], 1000000迭代。结果= True: 1569 ms

Regex (manyLongWordsEverywhere),1000000的迭代。结果= True:1580ms

完成

但我仍然相信regex的简单性和性能差异在100,000次迭代或更多时开始显现,regex仍然是这里的最佳解决方案

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

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

错误…我想你找不到比这更快的了:

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