如何检查字符串是否包含超过50个字符的单词
本文关键字:包含超 50个 字符 单词 是否 字符串 何检查 检查 | 更新日期: 2023-09-27 17:51:26
如何检查字符串是否包含超过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 ;
}