文字列変数 str には、その内部のどこかに次のものが含まれています。se\">
私はそれの始まりを見つけようとしています:
str.IndexOf("se\\\">")
-1を返します
部分文字列が見つからないのはなぜですか?
注: スニペットを編集したため、しばらくの間 5x \ が表示されていましたが、元のスニペットは 3 つ連続していました。
あなたのコードは実際に を検索してい'se\\">'
ます。バックスラッシュを含む文字列を検索する場合、通常、逐語的な文字列を使用する方が簡単です。
str.IndexOf(@"se\"">")
この場合、検索文字列にも引用符が含まれているため、まだエスケープがいくつかありますが、個人的には読みやすいと思います。
更新IndexOf
:私の答えは、呼び出しのパラメーターに余分なスラッシュを導入した編集に基づいていました。str
現在のバージョンに基づいて、予想される文字シーケンスが含まれていないことに賭けます。
更新 2 : この回答に関するコメントに基づいて、文字列内の「\」文字の役割に関して混乱しているようです。Visual Studio デバッガーで文字列を検査すると、エスケープ文字が表示されます。
したがって、テキスト ボックスに「c:\」と入力すると、デバッガーで Text プロパティを調べると「c:\\」と表示されます。エスケープの目的でバックスラッシュが追加されます。実際の文字列の内容はまだ 'c:\' です (これLength
は、文字列のプロパティをチェックすることで確認できます。4 ではなく 3 になります)。
次の文字列を取得すると(以下のコメントから取得)
" '<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
2 つの文字列の 1 つを正しくエスケープしていない可能性がありますか?
EDIT\
検索している文字列に余分なカップルがあります。
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\"">")
エラーが起こりにくいです。二重の "" と単一の \ に注意してください
編集、コメントの後に: 文字列にエスケープ自体が含まれている可能 性があるようです。 Indexof("se\">")
文字列内の DoubleQuotes は次のように指定する必要があります。""
逐語的な文字列の使用も検討してください。例は次のようになります
var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">")); // returns 8