[英]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个示例字符串:
结果可以在这里看到(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.