字符串变量 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 /><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\"">")
更不容易出错。注意双“”和单\
编辑,在评论之后:似乎字符串可能包含转义本身,在这种情况下,在 se\"> 中\"是一个转义的引号,所以文字文本只是se">并且要使用的字符串是 Indexof("se\">")
字符串中的双引号需要像这样指定""
也考虑使用逐字字符串 - 所以一个例子是
var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">")); // returns 8