繁体   English   中英

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

[英]How to check if a string contains a word longer than 50 characters?

如何检查字符串是否包含长度超过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与编译的正则表达式):

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

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

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

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

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

正则表达式[oneLongWordAtEnd],1000000次迭代。 结果=真:14225毫秒

正则表达式[oneLongWordAtBegining],1000000次迭代。 结果=正确:6483毫秒

正则表达式[manyLongWordsEverywhere],1000000次迭代。 结果=真:6675毫秒

测试的源代码在此处

当然,在常规条件下(谁理智地运行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毫秒

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

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

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

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

正则表达式[oneLongWordAtEnd],1000000次迭代。 结果=真:7217毫秒

正则表达式[oneLongWordAtBegining],1000000次迭代。 结果=真:3279毫秒

正则表达式[manyLongWordsEverywhere],1000000次迭代。 结果=真:3283毫秒

完成

在这种情况下,正则表达式比LINQ慢的原因令人惊讶,但也许并非如此,因为我已经被正则表达式烧死了很多次。 它们是一个很棒的工具,但是非常沉重。 在这种情况下,我以为正则表达式可以比LINQ稍早一些,但事实并非如此。

在很多情况下,稍微复杂一点但类似的正则表达式要优于LINQ:

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

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

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

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

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

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

正则表达式[oneLongWordAtEnd],1000000次迭代。 结果=真:4147毫秒

正则表达式[oneLongWordAtBegining],1000000次迭代。 结果=真:1569毫秒

正则表达式[manyLongWordsEverywhere],1000000次迭代。 结果=正确:1580毫秒

完成

但是我仍然相信regex的简单性,并且在100,000次或更多次迭代后才开始看到性能差异,regex仍然是此处的最佳解决方案

取决于您要查找的标点符号,但基本上是:

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

Errr ...我认为您找不到比以下任何东西更快的东西:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM