首页 > 解决方案 > 使用 IndexOf 和 Substring 在 IndexOf 之后捕获字符串

问题描述

我刚刚遇到了一些问题,我会要求您提供其他可能的解决方案。我有一个字符串:

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但要么它不是我正在寻找的解决方案/问题,要么我不明白......

提前感谢您的帮助,阿迪斯

标签: regexpowershell

解决方案


由于 SubString 的其中一个重载仅采用起始 index,因此首先找到哪里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!

推荐阅读