Получить строку после String.indexof в c # - PullRequest
15 голосов
/ 24 февраля 2011

В настоящее время я разрабатываю приложение на 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. Как я могу получить содержимое строки от индекса до конца?

Спасибо за любую помощь, которую вы можете предоставить.

EDIT: Просто обнаружил, что различные вещи, которые я попробовал, которые были предложены, действительно работают, за исключением того, что они не получают значение от последней кнопки, нажатой в текстовое поле. Я использую Событие KeyPress для того, чтобы сделать это.

Например, если я введу .123, он напечатает только 12. Затем, если я добавлю 4 в конце, он напечатает 123

Ответы [ 6 ]

29 голосов
/ 24 февраля 2011

Перегрузка String.Substring, которую вы используете, принимает начальный индекс и указанную длину.В качестве начального индекса вы используете местоположение ".", но в качестве длины вы используете длину всей строки.Если index больше 0 , это вызовет исключение (как вы видели).

Вместо этого просто используйте это:

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

получит все символы в txtPriceLimit.Text после местоположения ".".Обратите внимание, что нам нужно добавить 1 к индексу;в противном случае «.» будет включено в результирующую подстроку.

4 голосов
/ 24 февраля 2011

Просто попробуйте сделать это вместо

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

Предполагается, что в строке содержится только 1 . и в строке будет 1.

2 голосов
/ 06 декабря 2013

Похоже, что многие люди находят это полезным, поэтому я хотел бы добавить некоторый код, который я создал для сообщества.

Это метод расширения, который я написал, который вернет текст в эта строка 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 голосов
/ 24 февраля 2011

Используйте это, это определенно будет работать: -

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);
}
1 голос
/ 24 февраля 2011

Ответ пончика правильный.

Поскольку вторым параметром подстроки является длина , а не 'конечный индекс', его ответ является гораздо более чистым эквивалентом:

string pennies = txtPriceLimit.Text.Substring(index, index-txtPriceLimit.Text.Length);
0 голосов
/ 11 августа 2017

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: exampleText равно String, и поэтому наш метод расширения доступен
  2. Строка 2: exampleText.TextFollowing() использует метод расширения

Дополнительный метод

Может быть полезно иметь дополнительный метод - получить предыдущую часть строки. Дополнительные методы расширения записываются и помещаются вместе в один модуль комбинированного кода:

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), прежде чем использовать эти методы расширения. Для более быстрого выполнения кода это можно было бы объединить с методами расширения, представленными выше, чего я не сделал. Это связано с тем, что медлительности не наблюдается, поэтому предпочтение отдается повторному использованию кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...