如何检查一个字符串是否包含超过50个字符的单词?如何检查一个字符串是否包含超过50个字符的单词?
回答
例如,与LINQ:
string toCheck = "your string here";
bool isLong = toCheck
.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Any(s => s.Length > 50);
编辑
出于好奇,与人怀疑正则表达式会更快(我以为也是如此),我已经运行一些简单的测试。不得不承认我对结果感到惊讶:
LINQ(或者说,确切地说,string.Split和LINQ)比编译正则表达式和6-30的执行速度要快于未编译正则表达式和6-30。
我下Release
模式下运行的各溶液1'000'000
迭代中,检查4个采样串:
- 一个与无50个字符+长字
- 一个正好与一个50个字符+长字,在所述串的端
- 一个正好与一个50个字符+长字,在begining字符串的
- 一个具有多个50个字符+长字,字符串
结果在这里可以看到周围蔓延(LINQ VS正则表达式编译):
LINQ [noLongWords],百万迭代。结果=假:867 ms
LINQ [oneLongWordAtEnd],1000000次迭代。结果= True:986 ms
LINQ [oneLongWordAtBeining],1000000次迭代。结果= True:827 ms
LINQ [manyLongWordsEverywhere],1000000次迭代。结果=真:2399毫秒
正则表达式[noLongWords],1000000次迭代。结果=假:16714毫秒
正则表达式[oneLongWordAtEnd],1000000次迭代。结果=真:14225 ms
正则表达式[oneLongWordAtBeining],1000000次迭代。结果=真:6483 ms
正则表达式[manyLongWordsEverywhere],1000000次迭代。结果=真:6675 ms
测试的源代码可用here。
当然,在正常情况下(谁的理智运行1'000'000
迭代?),差异是无关紧要的,人们应该更容易/更可维护的解决方案。
感谢您的实验。我在回答中添加了一些回复 – manojlds 2011-04-23 02:26:30
取决于你要寻找的,但基本上是标点符号:
string input = "fox jumped over the fence.";
bool hasLongWord = input.Split(new[] { ' ', ';', '.' },
StringSplitOptions.RemoveEmptyEntries)
.Any(word => word.Length > 50);
正则表达式不会更快吗? – Nix 2011-04-22 21:13:32
义不容辞的正则表达式的答案:
Regex re = new Regex(@"(\w){50,}");
re.IsMatch(input);
PS:虽然我倾向于远离正则表达式了,我觉得在这正则表达式更简单快捷。 @ jimmy_keen的实验
@jimmy_keen后
编辑 - 感谢您的。
我删除了论坛,因为它是不是真的需要和所需要的时间为正则表达式的少得多,以下是编译输出:
更改正则表达式:
Regex regex = new Regex(@"\w{50,}", RegexOptions.Compiled);
输出:
LINQ [noLongWords],百万 迭代。结果=假:725 ms
LINQ [oneLongWordAtEnd],1000000 迭代。结果=真:760 ms
LINQ [oneLongWordAtBeining],1000000 迭代。结果=真:651毫秒
LINQ [manyLongWordsEverywhere], 百万迭代。结果=真: 2107 ms
正则表达式[noLongWords],1000000 迭代。结果=假:2773毫秒
正则表达式[oneLongWordAtEnd],1000000 迭代。结果=真:7217 ms
正则表达式[oneLongWordAtBeining],1000000 迭代。结果=真:3279毫秒
正则表达式[manyLongWordsEverywhere], 百万迭代。结果=真: 3283毫秒
DONE
正则表达式在这种情况下比LINQ慢是为那种令人惊讶,但也许不是,因为我已经被烧毁正则表达式多次。他们是一个伟大的工具,但非常重。在这种情况下,我想正则表达式将能够来稍稍领先LINQ的,但事实并非如此。
稍微复杂一些,但类似的正则表达式中的许多长的单词的情况下优于LINQ:
Regex regex = new Regex(@"[A-Za-z0-9]{50,}", RegexOptions.Compiled);
LINQ [noLongWords],百万 迭代。结果=假:611 ms
LINQ [oneLongWordAtEnd],1000000 迭代。结果=真:642 ms
LINQ [oneLongWordAtBeining],1000000 迭代。结果=真:549 ms
LINQ [manyLongWordsEverywhere],1000000 迭代。结果=真:1914 ms
Regex [noLongWords],1000000 迭代。结果=假:2085毫秒
正则表达式[oneLongWordAtEnd],1000000 迭代。结果=真:4147毫秒
正则表达式[oneLongWordAtBeining],1000000 迭代。结果=真:1569 ms
正则表达式[manyLongWordsEverywhere], 1000000次迭代。结果=真: 1580毫秒
DONE
但我仍然认为,正则表达式,而且simplicty的性能差异开始在100,000次迭代以上可以看出,正则表达式仍然是最好的解决办法这里
Errr ...我不认为你会发现任何快于:
private static Regex rxLongWord = new Regex(@"\w{50,}") ;
public HasLongWord(string s)
{
bool foundLongWord = rxLongWord.IsMatch(s) ;
return foundLongWord ;
}
它适用于我只需要改变,以检查是否超过130个字符的字符串中的网址或电子邮件 – Michael 2011-04-22 21:34:33
当然,你可能首先要解决的“单词”的定义B ^)—它是,你怎么说,受解释。 – 2011-04-22 22:49:22
- 1. Applescript:检查一个字符串是否包含空字符串?
- 2. 如何检查一个字符串是否包含一个子字符串 - mysql
- 3. 如何检查字符串是否包含某个字符?
- 4. 如何检查一个单词列表是否包含任何字符串
- 5. Javascript - 如何检查一个字符串是否包含多个子字符串
- 6. Java,如何检查一个字符串是否包含数字?
- 7. 如何检查一个字符串是否包含任何一些字符串
- 8. 如何检查链接字符串是否包含单词? (PHP)
- 9. 检查一个字符串是否只包含特殊字符
- 10. 如何检查一个TextView是否包含某个字符串
- 11. 如何检查一个字符串是否包含两个相同的字符?
- 12. 检查一个字符串是否超过xx个字符而不通过strlen()来检查整个字符串?
- 13. 如何检查一个字符串是否包含两个星号字符?
- 14. 有效检查一个字符串是否包含另一个字符串
- 15. 检查一个字符串是否包含另一个字符串
- 16. 检查一个字符串是否包含数字和字母
- 17. 如何检查一个字符串是否包含来自另一个字符串的任何字符?
- 18. 检查2个字符串是否包含相同的字符?
- 19. 检查一个字符串包含在单词中的Java
- 20. 检查一个字符串是否不包含一些文字
- 21. 如何检查一个字符串是否包含zalgo文本?
- 22. 如何检查一个字符串是否包含char?
- 23. 如何检查一个字符串是否包含在ArrayList中?
- 24. 检查一个字符串是否包含PHP中的特定单词?
- 25. 检查一个List/ArrayList是否包含一个字符串的字符Java
- 26. 检查一个字符串是否包含一个int
- 27. 检查一个列表是否包含一个字符串
- 28. Java:检查字符串是否包含多个字符
- 29. 检查一个字符串是否包含任何字符串数组元素
- 30. 检查一个字符串是否包含数字
有吨的方法可以做到THI s ...你需要快吗?还是很简单? – Nix 2011-04-22 21:11:27
我同意尼克斯...很多方法来做到这一点。这让我问你使用的是什么版本的.Net。 – 2011-04-22 21:14:02