在C#中,如何使用正則表達式找到以'$'開頭並以空格結尾的所有單詞,長字符串?
回答
嘗試:
var matches = Regex.Matches(input, "(\\$\\w+) ");
在上面,\\w
匹配單詞字符。如果我是正確的,這些是A-Z,a-z和 - 。如果你想匹配所有不是空間的東西,你可以使用\\S
。如果你想要一個特定的集合,可以通過例如[a-zA-Z0-9]
。
圍繞(\\$\\w+)
的方括號確保了特定匹配的結果matches[0].Groups[1].Value;
給出了backets內部的值(因此排除了尾部空格)。
作爲一個完整的例子:
string input = "$a1 $a2 $b1 $b2";
foreach (Match match in Regex.Matches(input, "(\\$\\w+) "))
{
Console.WriteLine(match.Groups[1].Value);
}
這將產生以下輸出:
$a1
$a2
$b1
的$ b2爲當然省略,因爲它不具有結尾間隔。
var a1 = "fdjksf $jgjkd $hfj".Split(" ".ToCharArray())
.ToList()
.Where(X=>Regex.Match(X , "(\\$[a-zA-Z]*)").Success);
感謝您的快速回復,但是這隻會返回一個字符串的最後一場比賽,我想要獲得所有比賽。 – 2010-10-21 12:12:29
編輯於...... – 2010-10-21 12:38:54
您可以嘗試一下沒有正則表達式,這可能會更快。
string longText = "";
List<string> found = new List<string>();
foreach (var item in longText.Split(' '))
{
if (item.StartsWith("$"))
{
found.Add(item);
}
}
編輯: Zain公司謝赫的評論後,我寫了一個簡單的程序,以基準,在這裏不用的結果。
string input = "$a1 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2 $a2 $b1 $b2";
var s1 = Stopwatch.StartNew();
double first;
foreach (Match match in Regex.Matches(input, "(\\$\\w+) "))
{
}
s1.Stop();
Console.WriteLine(" 1) " + (s1.Elapsed.TotalMilliseconds * 1000 * 1000).ToString("0.00 ns"));
first = s1.Elapsed.TotalMilliseconds;
s1.Reset();
s1 = Stopwatch.StartNew();
foreach (var item in input.Split(' '))
{
if (item.StartsWith("$"))
{
}
}
s1.Stop();
Console.WriteLine(" 2) " + (s1.Elapsed.TotalMilliseconds * 1000 * 1000).ToString("0.00 ns"));
Console.WriteLine(s1.Elapsed.TotalMilliseconds - first);
輸出:
1) 730600.00 ns
2) 53000.00 ns
-0.6776
這意味着字符串函數(也用foreach)比正則表達式函數更快;)
我認爲你還沒有在性能優化方面做過工作,split方法和foreach循環itslef對性能至關重要,因此我總是儘量避免它們,這就是爲什麼我要求在我的正則表達式中題。 – 2010-10-21 12:39:29
請檢查我的答案的'編輯'部分。 – 2010-10-21 13:53:59
嗯,很好的例子,我印象深刻,我曾經使用Split方法和foreach循環,他們都是性能的關鍵,所以我們用戶的替代品。 – 2010-10-24 10:14:01
- 1. 正則表達式,以查找以空格開頭並以空格結尾的所有單詞
- 2. preg_replace刪除以http://開頭並以空格結尾的所有單詞
- 3. 如何查找以| b開頭並以| b結尾的所有單詞。 (例如:「adverb」和「balalaika」)
- 4. 如何查找以句點結尾的所有單詞?
- 5. 查找以輔音開頭和結尾的單詞
- 6. 查找以 - 開頭並以換行符結尾的字符串
- 7. 如何返回以某些字符開頭和結尾的所有單詞?
- 8. 如何返回以某些字符開頭和結尾的所有單詞?
- 9. Lucene:查找以特定前綴開頭的所有單詞
- 10. 查找以某個字母開頭的所有單詞
- 11. 查找以字母「it」結尾的單詞...否定所有其他單詞?
- 12. 如何查找以1開頭和結尾的所有子字符串?
- 13. 使用謂詞查找字符串開始並以A結尾
- 14. 正則表達式查找任何以@開頭並以空格,=,;結尾的字符串。或換行
- 15. egrep - 文本中以't'開頭並以'e'結尾的三個字母單詞
- 16. 查找以「X」開頭並以「Y」結尾的字符串並替換
- 17. 查找以特定前綴/後綴開頭/結尾的列表/文件中的所有單詞
- 18. 正則表達式匹配所有以字符串開頭並以字符串結尾的單詞
- 19. 如何替換以特定字符結尾的所有單詞?
- 20. 查找單詞除以空格
- 21. 合併所有以IF開始並以分號結尾的行
- 22. 查找嚴格以$開頭的單詞,正則表達式C#
- 23. MySQL:布爾全文搜索以x開頭/結尾的單詞?
- 24. C - 以相同字母開頭和結尾的單詞
- 25. 以y結尾的單詞
- 26. 如何查找以特定字符開頭的單詞
- 27. 如何形成正則表達式,以過濾掉以==開頭並以==結尾的單詞?
- 28. 正則表達式來查找以「&」開頭的詞,並且以&
- 29. 如何設置所有單詞的類以tinymce中的「#」開頭?
- 30. 查找名稱以某個後綴結尾的所有表格
感謝您的快速回復,但這隻返回我的最後一場比賽從字符串中,我想獲得所有的匹配。 – 2010-10-21 12:10:11
我用一個例子來說明答案。我不明白爲什麼這不會返回您的輸入測試中的所有項目。你能否提供一個只返回最後一場比賽的例子輸入? – 2010-10-21 12:13:32
對不起,你的正則表達式工作完全沒問題,實際上我沒有循環遍歷每一場比賽,我使用你的代碼匹配[0] .Groups [1] .Value;我只得到一場比賽。看到下面的代碼,它正常工作,並返回所有匹配。在下一條評論中添加代碼。 – 2010-10-21 12:58:35