對於新問題的道歉,但C#不是我的第一語言。如何正確匹配C#中的字詞分隔符而不匹配其他字符
我試圖建立一個索引列表中的所有分隔符之間的單詞,在給定的內容,佔標點符號。我希望能夠使用正則表達式\ b(單詞'邊界'),但它匹配我沒有預料到的各種東西。下面是我寫的方法:
internal static IList<int> GetBreakIndexesInContent(string content)
{
IList<int> indices = new List<int>();
if (content != null)
{
foreach (Match match in Regex.Matches(content, @"\b"))
{
Console.WriteLine("INDEX:[" + match.Index + "] CHAR:[" + content.Text[match.Index] + "] UNICODE:[" + (int)content.Text[match.Index] + "]");
indices.Add(match.Index);
}
}
return indices;
}
考慮下面的100個字符的字符串:
"Lorem ipsum dolor sit amet, tritani quaestio suscipiantur mea ea, duo et impedit facilisi evertitur."
我期待我的方法來產生一個列表的長度,其中第一個指標是14種元素5,第二個位置11,依此類推(忽略26和64位的逗號,以及99的時間段)。相反,這是我得到的輸出:
//COUNT: [30]
INDEX:[0] CHAR:[L] UNICODE:[76]
INDEX:[5] CHAR:[ ] UNICODE:[32]
INDEX:[6] CHAR:[i] UNICODE:[105]
INDEX:[11] CHAR:[ ] UNICODE:[32]
INDEX:[12] CHAR:[d] UNICODE:[100]
INDEX:[17] CHAR:[ ] UNICODE:[32]
INDEX:[18] CHAR:[s] UNICODE:[115]
INDEX:[21] CHAR:[ ] UNICODE:[32]
INDEX:[22] CHAR:[a] UNICODE:[97]
INDEX:[26] CHAR:[,] UNICODE:[44]
INDEX:[28] CHAR:[t] UNICODE:[116]
INDEX:[35] CHAR:[ ] UNICODE:[32]
INDEX:[36] CHAR:[q] UNICODE:[113]
INDEX:[44] CHAR:[ ] UNICODE:[32]
INDEX:[45] CHAR:[s] UNICODE:[115]
INDEX:[57] CHAR:[ ] UNICODE:[32]
INDEX:[58] CHAR:[m] UNICODE:[109]
INDEX:[61] CHAR:[ ] UNICODE:[32]
INDEX:[62] CHAR:[e] UNICODE:[101]
INDEX:[64] CHAR:[,] UNICODE:[44]
INDEX:[66] CHAR:[d] UNICODE:[100]
INDEX:[69] CHAR:[ ] UNICODE:[32]
INDEX:[70] CHAR:[e] UNICODE:[101]
INDEX:[72] CHAR:[ ] UNICODE:[32]
INDEX:[73] CHAR:[i] UNICODE:[105]
INDEX:[80] CHAR:[ ] UNICODE:[32]
INDEX:[81] CHAR:[f] UNICODE:[102]
INDEX:[89] CHAR:[ ] UNICODE:[32]
INDEX:[90] CHAR:[e] UNICODE:[101]
INDEX:[99] CHAR:[.] UNICODE:[46]
的原因,我不能簡單地試圖匹配" "
或更高版本只是針對過濾ASCII 32,是因爲這需要是不外語敏感必須在所有單詞之間使用空格。另外,因爲我不想無意中將多個空間捕捉爲單獨的「分隔符」。
我真的希望\b
將是一個很好的標準抓住所有真正的詞分離,但它似乎並非如此。我可以「自己動手」,但是如果C#已經具備某種設備來處理這個問題,那麼我希望自己能夠省去重新發明輪子的麻煩。
當然,任何幫助,將不勝感激。
謝謝, Greg。
'\ b'被稱爲_zero-width_轉義序列---它在技術上實際上不匹配任何_character_ ---但匹配所有,呃... _boundaries_,這就是爲什麼你看到更多結果超出您的預期。試試'\ b(?<= [a-zA-Z])'。這使用了一種叫做_positive lookbehind assertion_的東西來聲明邊界之前的字符是一個字母。如果你不希望_spaces_成爲這些邊界的一部分,那麼嘗試使用'\ b(?<= [a-zA-Z])(?!\ s)',它僅僅添加一個_negative lookahead assertion_來斷言那邊界之後的角色不是空格。 –
閱讀這篇文章的更多信息:http://www.regular-expressions.info/wordboundaries.html –