字符串变量str在其中包含以下内容:se\">
我正在尝试使用以下方式找到它的开头:
str.IndexOf("se\\\">")
返回-1
为什么不找到子串?
注意:由于编辑片段显示5x \一段时间,原来连续3个。
答案 0 :(得分:8)
您的代码实际上正在搜索'se\\">'
。在搜索包含反斜杠的字符串时,我通常会发现使用逐字字符串更容易:
str.IndexOf(@"se\"">")
在这种情况下,你在搜索字符串中也有引号,所以仍有一些转义,但我个人觉得它更容易阅读。
更新:我的回答是基于在IndexOf
调用参数中引入额外斜杠的编辑。根据当前版本,我会在str
上下注,但不包含预期的字符序列。
更新2 : 基于对这个答案的评论,似乎对字符串中'\'字符的作用存在一些混淆。在Visual Studio调试器中检查字符串时,将显示带有转义字符的字符串。
因此,如果你有一个文本框并在其中输入'c:\',检查调试器中的Text属性将显示'c:\\'。为了逃避目的,添加了额外的反斜杠。实际的字符串内容仍然是'c:\'(可以通过检查字符串的Length
属性来验证;它将是3,而不是4)。
如果我们采用以下字符串(取自下面的评论)
“'< em 类= \ “correct_response \” >一种 夜灯< / em>< br />< br />< table 宽度= \ “100%\” >< TR>< TD 类= \ “右\” >英格丽< / TD>< / TR>< /表>')“
... \"
序列只是转义引号;反斜杠不是字符串内容的一部分。因此,您实际上在寻找'se">'
,而不是'se\">'
。这些都可以起作用:
str.IndexOf(@"se"">"); // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">"); // regular string; escape quotation mark using backslash
答案 1 :(得分:2)
这有效:
string str = "<case\\\">";
int i = str.IndexOf("se\\\">"); // i = 3
也许你没有正确地转义两个字符串中的一个?
编辑您要搜索的字符串中还有一对\
。
答案 2 :(得分:2)
也许str变量实际上不包含反斜杠。 可能只是在调试时将鼠标悬停在变量上时,调试器工具提示将显示转义字符。
e.g。如果在此作业后放置断点
string str = "123\"456";
工具提示将显示123 \“456而不是123”456。
但是,如果单击visualize图标,您将获得正确的字符串123“456
答案 3 :(得分:1)
以下代码:
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
好像和我一起工作......
答案 4 :(得分:1)
TextBox2.Text = TextBox1.Text.IndexOf("se\"">")
似乎在VB中有效。
答案 5 :(得分:1)
如果您正在寻找 se \“&gt;
然后
str.IndexOf(@"se\"">")
不易出错。注意双“”和单\
在评论之后编辑:似乎字符串可能包含ecaping本身,在这种情况下 se \“&gt; \”是一个转义引号,所以文字文字只是 se“&gt; ,而使用的字符串是Indexof("se\">")
答案 6 :(得分:1)
字符串中的DoubleQuotes需要像""
一样指定。还要考虑使用逐字字符串 - 所以一个例子就是
var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">")); // returns 8