Я только что наткнулся на то, что хотел бы спросить у вас о других возможных решениях. У меня есть строка:
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, но либо это не та решение / вопрос, который я ищу или не понял ...
Заранее благодарим за помощь, Адис
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!
Похожие вопросы
Связанные вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки строк, разбора и преобразования. Укажите язык (PHP, Python и т. д.) или инструмент (grep, VS Code, Google Analytics и т. д.), который вы используете. Не размещайте вопросы, требующие объяснения того, что означает символ или чему будет соответствовать конкретное регулярное выражение.