【问题标题】:.NET string IndexOf unexpected result.NET 字符串 IndexOf 意外结果
【发布时间】:2009-06-25 11:39:15
【问题描述】:

字符串变量 str 在其中某处包含以下内容:se\">

我正在尝试使用以下方法找到它的开头:

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

返回 -1

为什么找不到子字符串?

注意:由于编辑sn-p有一段时间显示5x\,原来是连续3个。

【问题讨论】:

  • 你在做什么看起来没问题;你能发布实际的代码吗?也许这只是一个小细节……
  • 我认为您可能有一个额外的反斜杠 - 您确定它实际上不是您要查找的 se"> 吗?
  • 看原题和Kev版,indexof好像多了很多\,是不是报错了?
  • 使用逐字字符串文字(@"se\\">" 等)的答案可能有助于确保您拥有正确数量的反斜杠(msdn.microsoft.com/en-us/library/aa691090%28VS.71%29.aspx

标签: c# .net string indexof


【解决方案1】:

您的代码实际上是在搜索'se\\">'。在搜索包含反斜杠的字符串时,我通常会发现使用逐字字符串更容易:

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

在这种情况下,您在搜索字符串中也有一个引号,因此仍有一些转义,但我个人觉得更容易阅读。

更新:我的回答是基于在 IndexOf 调用的参数中引入额外斜杠的编辑。根据当前版本,我将赌注押在str 根本不包含预期的字符序列。

更新 2: 基于这个答案的 cmets,关于字符串中 '\' 字符的作用似乎有些混乱。当您在 Visual Studio 调试器中检查字符串时,它会以转义字符显示。

因此,如果您有一个文本框并在其中输入“c:\”,则在调试器中检查 Text 属性将显示“c:\\”。为转义目的添加了一个额外的反斜杠。实际的字符串内容仍然是 'c:\'(可以通过检查字符串的 Length 属性来验证;它将是 3,而不是 4)。

如果我们采用以下字符串(取自下面的评论)

" '一个 夜灯

英格丽')"

...\" 序列只是转义的引号;反斜杠不是字符串内容的一部分。所以,您实际上是在寻找'se">',而不是'se\">'。这些都可以工作:

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

【讨论】:

  • 这似乎不起作用。这是 VS 2008 即时窗口的输出。 ? answer " '小夜灯

    英格丽
    ')" ? answer.IndexOf(@"se\"">") -1
  • 请注意,在您看到的'se\">'序列中,'\'字符只是引号的转义字符。字符串内容实际上是'se">',没有反斜杠。 str.IndexOf(@"se"">") 应该会找到您想要的内容。
【解决方案2】:

这行得通:

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

也许您没有正确转义两个字符串之一?

编辑在您要搜索的字符串中多了一对\

【讨论】:

  • 对我来说也是如此:string str = ""; int i = str.IndexOf("se\">");
  • 不适用于此字符串:" '夜灯

    英格丽
    ')"
【解决方案3】:

也许 str 变量实际上并不包含反斜杠。 可能只是在调试时将鼠标悬停在变量上时,调试器工具提示会显示转义字符。

例如如果你在这个赋值之后放了一个断点

string str = "123\"456";

工具提示将显示 123\"456 而不是 123"456。

但是如果你点击可视化图标,你会得到正确的字符串 123"456

【讨论】:

    【解决方案4】:

    以下代码:

    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
    

    似乎对我有用...

    【讨论】:

      【解决方案5】:
      TextBox2.Text = TextBox1.Text.IndexOf("se\"">")
      

      似乎在 VB 中工作。

      【讨论】:

        【解决方案6】:

        字符串中的双引号需要指定为"" 也考虑使用逐字字符串 - 所以一个例子是

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

        【讨论】:

          【解决方案7】:

          如果您正在寻找se\">

          然后

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

          不容易出错。注意双“”和单\

          在评论之后编辑:似乎字符串可能包含转义本身,在这种情况下 se\"> \" 是转义引号,所以文字文本只是 se"> 并且要使用的字符串是 Indexof("se\"&gt;")

          【讨论】:

          • 如果您查看原始问题与 Kev 版本,您可以看到额外的 \ 来自哪里
          • 你们都可能是正确的,但由于某种原因,建议的答案不适用于此字符串(外引号不是字符串的一部分):不适用于此字符串:" ' 小夜灯

            Ingrid
            ')"
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-18
          • 1970-01-01
          • 1970-01-01
          • 2015-08-13
          • 1970-01-01
          • 2021-09-02
          相关资源
          最近更新 更多