如何检查字符串是否包含超过50个字符的单词?
答案 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个示例字符串:
结果可以在这里看到(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 ;
}