Я только что наткнулся на то, что хотел бы спросить у вас о других возможных решениях. У меня есть строка:

string text = "This is a very serious sample text, not a joke!"

Теперь я хотел бы найти позицию слова «серьезный» и получить остальную часть строки ПОСЛЕ «серьезного».

Один из способов решить эту проблему:

$text="This is a very serious sample text, not a joke!"
$start=($text).IndexOf("serious")


(($text).Substring($start+"serious".Length)).TrimStart()

Я уверен, что для этого есть решение с использованием регулярных выражений, но мне было интересно, могу ли я использовать IndexOf (), а затем Substring, чтобы получить остальную часть строки ПОСЛЕ "серьезного".

Я также просматривал этот пост здесь: Раздражающая строковая подстрока и IndexOf, но либо это не та решение / вопрос, который я ищу или не понял ...

Заранее благодарим за помощь, Адис

0
Adis1102 23 Сен 2020 в 09:17

1 ответ

Лучший ответ

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

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

Вот так,

$searchTerm = "serious " 
$start = $text.IndexOf($searchTerm)
$text.Substring($start + $searchTerm.length)
sample text, not a joke!

Что касается простого регулярного выражения, используйте -replace и шаблон ^.*serious . Это будет соответствовать началу строки ^, затем чему-либо .*, за которым следует seroius . Замена этого на пустую строку удаляет совпадающее начало строки. Вот так,

"This is a very serious sample text, not a joke!" -replace '^.*serious ', ''
sample text, not a joke!

Могут быть случаи, когда Методы расширения были бы прямым решением. Они позволяют добавлять новые методы к существующим классам .Net. Обычным решением было бы наследование, но поскольку строка запечатана, это недопустимо. Итак, методы расширения - это то, что нужно. Одним из вариантов может быть создание метода, скажем, IndexEndOf, который будет возвращать данные в том месте, где заканчивается поисковый запрос.

Добавить код .Net (в данном случае C #) достаточно просто. Пример кода адаптирован из другого ответа. Метод IndexEndOf выполняет арифметические операции и возвращает индекс, на котором закончился шаблон. Вот так,

$code=@'
public class ExtendedString {

    public string s_ {get; set;}

    public ExtendedString(string theString){
        s_ = theString;
    }

    public int IndexEndOf(string pattern)
    {
        return s_.IndexOf(pattern) + pattern.Length;
    }

    public static implicit operator ExtendedString(string value){
        return new ExtendedString(value);
    }
}
'@
add-type -TypeDefinition $code

$text = "This is a very serious sample text, not a joke!"
$searchTerm = "serious "
$text.Substring(([ExtendedString]$text).IndexEndOf($searchTerm)) 

sample text, not a joke!
1
vonPryz 23 Сен 2020 в 08:25