簡體   English   中英

奇怪的 string.IndexOf 行為

[英]strange string.IndexOf behavour

我寫了以下代碼段來消除文本塊中過多的空格

int index = text.IndexOf("  ");
while (index > 0)
{
    text = text.Replace("  ", " ");
    index = text.IndexOf("  ");
}

通常這工作正常,盡管相當原始並且可能效率低下。

問題

當文本包含“ - ”出於某種奇怪的原因時, indexOf 返回匹配項! 替換功能不會刪除任何內容,然后陷入無限循環。

任何想法 string.IndexOf 發生了什么?

啊,文字的樂趣。

您最有可能在那里擁有但在 SO 上發布時丟失的東西是“軟連字符”。

為了重現這個問題,我在LINQPad 中嘗試了這個代碼:

void Main()
{
    var text = "Test1 \u00ad Test2";
    int index = text.IndexOf("  ");
    while (index > 0)
    {
        text = text.Replace("  ", " ");
        index = text.IndexOf("  ");
    }
}

果然,上面的代碼只是陷入了一個循環。

請注意,根據 CharMap, 是 Soft Hyphen 的 Unicode 符號。 您也可以隨時復制和粘貼 CharMap 中的字符,但將其張貼在 SO 上將替換為更常見的表親,連字符減號,Unicode 符號u002d (鍵盤上的那個)。

您可以閱讀String Class文檔中的一小部分,其中有關於該主題的內容:

字符串搜索方法,例如 String.StartsWith 和 String.IndexOf,也可以執行區分區域性或序數的字符串比較。 以下示例說明了使用 IndexOf 方法進行的有序比較和區分區域性的比較之間的差異。 當前區域性為英語(美國)的區域性敏感搜索考慮子字符串“oe”以匹配連字“œ”。 由於軟連字符 (U+00AD) 是零寬度字符,因此搜索將軟連字符視為等同於 Empty 並在字符串的開頭找到匹配項。 另一方面,序數搜索在任何一種情況下都找不到匹配項。

我已經強調了相關部分,但我還記得前一段時間有一篇關於這個確切問題的博客文章,但我的 Google-Fu 今晚讓我失望了。

這里的問題是 IndexOf 和 Replace 使用不同的方法來定位文本。

IndexOf 會將軟連字符視為“不存在”,因此將其兩側的兩個空格發現為“兩個連接的空格”,而 Replace 方法不會,因此不會刪除它們中的任何一個。 因此,存在循環繼續迭代的條件,但由於 Replace 不會刪除符合條件的空格,因此它永遠不會結束。 毫無疑問,Unicode 符號空間中還有其他這樣的字符表現出類似的問題,但這是我見過的最典型的情況。

至少有兩種處理方法:

  1. 可以用Regex.Replace,好像沒有這個問題:

     text = Regex.Replace(text, " +", " ");

    就我個人而言,我可能會在正則表達式中使用空格特殊字符,即\\s ,但如果您只想要空格,則上述方法應該可以解決問題。

  2. 您可以明確要求 IndexOf 使用序數比較,它不會被文本行為所絆倒......好吧......文本:

     index = text.IndexOf(" ", StringComparison.Ordinal);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM