簡體   English   中英

.NET字符串IndexOf意外結果

[英].NET string IndexOf unexpected result

字符串變量str在其中包含以下內容: se\\">

我正在嘗試使用以下方法找到它的開頭:

str.IndexOf("se\\\">")  

返回-1

為什么不找到子串呢?

注意:由於編輯片段顯示5x \\一段時間,原來連續3個。

你的代碼實際上在搜索'se\\\\">' 。當搜索包含反斜杠的字符串時,我通常會發現使用逐字字符串更容易:

str.IndexOf(@"se\"">")

在這種情況下,你在搜索字符串中也有一個引號,所以仍然有一些轉義,但我個人覺得它更容易閱讀。

更新 :我的回答是基於在IndexOf調用中將參數中的額外斜杠引入的編輯。 基於當前版本,我會將我的賭注押在str而不是包含預期的字符序列。

更新2 :基於對此答案的評論,似乎對字符串中'\\'字符的作用存在一些混淆。 在Visual Studio調試器中檢查字符串時,將顯示帶有轉義字符的字符串。

因此,如果您有一個文本框並在其中鍵入“c:\\”,則檢查調試器中的Text屬性將顯示“c:\\\\”。 為了逃避目的,添加了額外的反斜杠。 實際的字符串內容仍然是'c:\\'(可以通過檢查字符串的Length屬性來驗證;它將是3,而不是4)。

如果我們采用以下字符串(取自下面的評論)

“'<em class = \\”correct_response \\“>一盞夜燈</ em> <br /> <table width = \\”100%\\“> <tr> <td class = \\”right \\“ >英格麗</ TD> </ TR> </ TABLE>')”

... \\"序列只是轉義引號;反斜杠不是字符串內容的一部分。所以,你實際上是在尋找'se">' ,而不是'se\\">' 。這些都可以工作:

str.IndexOf(@"se"">");  // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">");   // regular string; escape quotation mark using backslash

這有效:

string str = "<case\\\">";
int i = str.IndexOf("se\\\">"); // i = 3

也許你沒有正確地逃避兩個字符串中的一個?

編輯你要搜索的字符串中還有一對\\

也許str變量實際上不包含反斜杠。 可能只是當您在調試時將鼠標懸停在變量上時,調試器工具提示將顯示轉義字符。

例如,如果在此分配后放置斷點

string str = "123\"456";

工具提示將顯示123 \\“456而不是123”456。

但是,如果單擊可視化圖標,您將獲得正確的字符串123“456

以下代碼:

public static void RunSnippet()
{
    string s = File.ReadAllText (@"D:\txt.txt");
    Console.WriteLine (s);
    int i = s.IndexOf("se\\\">");
    Console.WriteLine (i);
}

給出以下輸出:

some text before se\"> some text after
17

好像在跟我工作......

TextBox2.Text = TextBox1.Text.IndexOf("se\"">")

似乎在VB中工作。

如果你正在尋找se \\“>

然后

str.IndexOf(@"se\"">") 

不太容易出錯。 注意雙“”和單\\

在評論之后編輯:似乎字符串可能包含ecaping本身,在這種情況下, se \\“> \\”是一個轉義引號,因此文字文本只是se“>而且要使用的字符串是Indexof("se\\">")

字符串中的DoubleQuotes需要像""一樣指定。還要考慮使用逐字字符串 - 所以一個例子就是

var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">"));  // returns 8

暫無
暫無

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

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