替换字符串中包含在空格中的单词的第一次出现

Replacing first occurence of a word enclosed in spaces in a string

// SO 上有一些类似的问题,但其中 none 似乎涵盖了替换整个单词(包含在空格中)及其首次出现。同时使用两者是导致我出现问题的原因。

我想替换第一次出现的被空格包围的单词,但我 运行 遇到了一些问题。

我在 range.Text 中有一个包含长字符串的字符串。我想找到类似“@val1”“@val2”等的词,并将它们替换为我的值列表中的值。这是我的做法:

while(i < valueCount && range.Text.Contains("@val"))
{

    for (int j = 0; j < valueLimit; j++)
    {
        string pattern = $@"\b@val{ j + 1 }\b";
        Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
        Match match = regex.Match(range.Text);

        if (match.Success)
        {
            range.Text = regex.Replace(range.Text, values[j], 1);
            i++;
        }
    }
}

现在的问题是,出于某种原因,match.Success 从来都不是真的,尽管我很确定其中有很多我在其中搜索的值。

// 示例字符串 -

"1\t@val1\r2\t@val2\r3\t@val3\r4\t@val4\r5\t@val5\r6\t@val6\r7\t@val7\r8\t@val8\r9\t@val9\r10\t@val10\r11\t@val11\r12\t@val12\r13\t@val13\r14\t@val14\r15\t@val15\r\r"

我希望忽略 \t 和 \r ,但空格对我来说很重要。否则,当循环位于@val11 或@val10 时,我将替换@val110。两个 val 永远不会只用一个制表符分开。它们将始终包含在长字符串中的两个空格中。

问题似乎是您模式中的主要 \b。有了它,匹配总是失败。

尾随的那个是必不可少的,这样 @val1 也不会错误地匹配 @val10,但我没有看到前导的是什么,它导致匹配失败。

尝试更改:

string pattern = $@"\b@val{ j + 1 }\b";

string pattern = $@"@val{ j + 1 }\b";

除此之外,代码似乎实现了您所描述的内容。

希望对您有所帮助