web-dev-qa-db-ja.com

C#でString.indexofの後に文字列を取得する

現在C#でアプリケーションを開発していますが、文字列内の特定の文字の後に部分文字列を取得する必要があります。

else if (txtPriceLimit.Text.Contains('.') && char.IsNumber(e.KeyChar))
{
    int index = txtPriceLimit.Text.IndexOf('.');
    string pennies = txtPriceLimit.Text.Substring(index, txtPriceLimit.Text.Length);
    Console.WriteLine("Pennies: " + pennies);
}

なんらかの理由でIndexOutOfRangeExceptionが思い付き続けます。文字列の内容をインデックスから最後まで取得するにはどうすればよいですか?

あなたが提供できるあらゆる助けをありがとう。

編集:提案されているさまざまなことは、テキストフィールドに最後に押したボタンから値を取得しないことを除いて、機能しているようです。これを行うためにKeyPressイベントを使用しています。

たとえば、.123と入力すると、12しか印刷されません。最後に4を追加すると、123と印刷されます。

15
Boardy

使用している String.Substring のオーバーロードは、開始インデックスと指定された長さを取ります。開始インデックスとして、「.」の場所を使用していますが、長さとして、文字列全体の長さを使用しています。 indexがより大きい場合、これにより例外が発生します(ご覧のとおり)。

代わりに、これを使用してください:

string pennies = txtPriceLimit.Text.Substring(index + 1);

これは、「txtPriceLimit.Text」の場所の.after内のすべての文字を取得します。インデックスに1を追加する必要があることに注意してください。それ以外の場合、「.」は結果のサブストリングに含まれます。

29
Donut

代わりにこれをやってみてください

string pennies = txtPriceLimit.Text.Split('.')(1);

これは、1つだけがあると仮定します.は文字列に含まれ、文字列には1が含まれます。

4
msarchet

多くの人がこれが便利だと思っているようですので、私が作成したコードをコミュニティに寄稿したいと思いました。

これは、パラメータstring valueに続くthis string txtのテキストを返す、私が作成した拡張メソッドです。

リスト1:

public static string TextFollowing(this string txt, string value) {
  if (!String.IsNullOrEmpty(txt) && !String.IsNullOrEmpty(value)) {
    int index = txt.IndexOf(value);
    if (-1 < index) {
      int start = index + value.Length;
      if (start <= txt.Length) {
        return txt.Substring(start);
      }
    }
  }
  return null;
}

例1:

string exampleText = "My cat is bad.";
string afterCat = exampleText.TextFollowing("cat");
// afterCat = " is bad.";

拡張メソッドにまだ来ていない人は、次のように同様に定義されたツールから同じ結果を得ることができます。

リスト2:

public static string TextFollowing(string searchTxt, string value) {
  if (!String.IsNullOrEmpty(searchTxt) && !String.IsNullOrEmpty(value)) {
    int index = searchTxt.IndexOf(value);
    if (-1 < index) {
      int start = index + value.Length;
      if (start <= searchTxt.Length) {
        return searchTxt.Substring(start);
      }
    }
  }
  return null;
}

例2:

string exampleText = "My cat is bad.";
string afterCat = TextFollowing(exampleText, "cat");
// afterCat = " is bad.";

上記の各例で、exampleTextが空の文字列の場合、検索値はnullまたは空の文字列でした。または、検索値が見つからない場合、結果の文字列はnullになります。

私のツールリストにはこのコードが含まれており、多数のプロジェクトの無数の場所で使用されており、常に適切に機能します。

2
jp2code

これを使用してください、これは間違いなく動作します:-

else if (txtPriceLimit.Text.Contains('.') && char.IsNumber(e.KeyChar))
{
    int index = txtPriceLimit.Text.IndexOf('.');
    string pennies = txtPriceLimit.Text.Substring(index+1, txtPriceLimit.Text.Length-(index+1));
    pennies=pennies+e.KeyChar.ToString();
    Console.WriteLine("Pennies: " + pennies);
}
2
Ankush Roy

ドーナツの答えは正しいです。

Substringの2番目のパラメーターはlengthであるので、 'end index'ではないので、彼の答えは次のようにはるかに明確になります。

string pennies = txtPriceLimit.Text.Substring(index, index-txtPriceLimit.Text.Length);
1
John Arlen

VisualBasicバージョン

部分文字列を検索するコードは、見つかった場合、末尾部分を返します-見つかった部分文字列の直後(末尾を追跡)の残りの文字列。

jp2codeの答えは、エレガントな方法で私の目的に適合しました。例に加えて、作成者は、コードが長い間十分に試行およびテストされていることも示しました。 VisualBasic彼/彼女のコードと同等:

_Imports System.Runtime.CompilerServices

Module StringExtensions
    <Extension()>
    Public Function TextFollowing(txt As String, value As String) As String
        If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
            Dim index As Integer = txt.IndexOf(value)
            If -1 < index Then
                Dim start As Integer = index + value.Length
                If start <= txt.Length Then
                    Return txt.Substring(start)
                End If
            End If
        End If
        Return Nothing
    End Function
End Module
_

コードはVS Community 2017を使用してテストされています。

使用例

_Dim exampleText As String = "C-sharp to VisualBasic"
Dim afterCSharp = exampleText.TextFollowing("to")
'afterCSharp = " VisualBasic"
_

拡張メソッドTextFollowing()Stringオブジェクトで使用できるようになりました。

  1. 1行目:exampleTextStringであるため、拡張メソッドを使用できます
  2. 2行目:exampleText.TextFollowing()は拡張メソッドを使用します

補完的な方法

文字列の前の部分を取得する、補完的な方法があると便利な場合があります。補完的な拡張メソッドは、1つの結合コードモジュールにまとめて記述されます。

_Imports System.Runtime.CompilerServices

Module StringExtensions
    <Extension()>
    Public Function TextFollowing(txt As String, value As String) As String
        If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
            Dim index As Integer = txt.IndexOf(value)
            If -1 < index Then
                Dim start As Integer = index + value.Length
                If start <= txt.Length Then
                    Return txt.Substring(start)
                End If
            End If
        End If
        Return Nothing
    End Function
    <Extension()>
    Public Function TextPreceding(txt As String, value As String) As String
        If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
            Dim index As Integer = txt.IndexOf(value)
            If -1 < index Then
                Return txt.Substring(0, index)
            End If
        End If
        Return Nothing
    End Function
End Module
_

使用例

_Dim exampleText As String = "C-sharp to VisualBasic"
Dim beforeVisualBasic = exampleText.TextPreceding("to")
'beforeVisualBasic = "C-sharp "
_

私の使用例では、これらの拡張メソッドを使用する前にLargeString.Contains(SmallString)かどうかを確認する必要があります。より高速なコード実行のために、これは私がしなかった上記の拡張メソッドと組み合わせることができたでしょう。これは、スローネスが発生しないため、コードの再利用性が優先されるためです。

0
coarist