C# String 在给定字符串后第一次出现某个字符串后追加一些字符串

C# String append some string ater first occurance of a string after a given string

我知道这似乎很复杂,但我的意思是例如我有一个字符串

This is a text string 

我想搜索一个字符串(例如:文本)。我想找到这个字符串在给定的另一个字符串之后的第一次出现(例如:是)并且替换应该是给定的另一个字符串(例如:replace)

所以结果应该是:

This is a textreplace string

如果文本是 This text is a text string 那么结果应该是 This text is a textreplace string

我需要一个方法(欢迎使用扩展方法):

public static string AppendFirstOccurranceAfter(this string originalText, string after, string oldValue, string newValue)
// "This is a text string".ReplaceFirstOccurranceAfter("is", "text", "replace")

这里是扩展方法:

        public static string CustomReplacement(this string str)
        {
            string find = "text"; // What you are searching for
            char afterFirstOccuranceOf = 'a'; // The character after the first occurence of which you need to find your search term.
            string replacement = "replace"; // What you will replace it with.  is everything before the first occurrence of 'a' and  is the term you searched for.

            string pattern = $"([^{afterFirstOccuranceOf}]*{afterFirstOccuranceOf}.*)({find})";

            return Regex.Replace(str, pattern, replacement);
        }

你可以这样使用它:


string test1 = "This is a text string".CustomReplacement();
string test2 = "This text is a text string".CustomReplacement();

此解决方案使用 C# 正则表达式。 Microsoft 的文档在这里:https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

您必须找到要匹配的第一个单词的索引,然后使用该索引再次搜索从该索引开始的第二个单词,然后您可以插入新文本。您可以使用 IndexOf method 找到所述索引(检查它的重载)。

这是一个简单的解决方案,其编写方式(我希望)是可读的,并且您可以改进以使其更加地道:

    public static string AppendFirstOccurranceAfter(this string originalText, string after, string oldValue, string newValue) {
    var idxFirstWord = originalText.IndexOf(after);
    var idxSecondWord = originalText.IndexOf(oldValue, idxFirstWord);
    var sb = new StringBuilder();

    for (int i = 0; i < originalText.Length; i++) {
        if (i == (idxSecondWord + oldValue.Length))
            sb.Append(newValue);
        sb.Append(originalText[i]);
    }

    return sb.ToString();
}