[英].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.