//在SO上有一些类似的问题,但它们似乎都不包括替换整个单词(用空格括起来)和它的第一次出现。同时使用两者是导致我出现问题的原因。
我想要替换由空格包围的单词的第一次出现,我遇到了一些问题。
我在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++;
}
}
}
现在的问题是,由于某种原因,匹配。即使我很确定有很多值,比如我在其中搜索的值,因此成功永远不会成立。
//示例字符串 -
“1 \吨@ VAL1 \ R2 \吨@ val2的\ R3 \吨@ VAL3 \ R4 \吨@ VAL4 \ R5 \吨@ val5 \ R6 \吨@ VAL6 \ R7 \吨@ val7 \ R8 \吨@的Val8 \ R9 \吨@ val9 \ R10 \吨@ val10 \ R11 \吨@ VAl11难\ R12 \吨@ val12 \ R13 \吨@ val13 \ R14 \吨@ val14 \ R15 \吨@ val15 \ r \ R”
\ t s和\ r \ n我希望被忽略,但空格对我来说很重要。否则,当循环位于@ val11或@ val10时,我将替换@ val110。两个val永远不会只用一个标签分开。它们将始终包含在长字符串中的两个空格中。
这个问题似乎是你模式中领先的\b
。有了这个,比赛总是失败。
尾随的一个是必不可少的,所以@val1
也不会错误地匹配@val10
,但我没有看到领先的是什么,并且它导致匹配失败。
尝试改变:
string pattern = $@"\b@val{ j + 1 }\b";
至
string pattern = $@"@val{ j + 1 }\b";
除此之外,代码似乎实现了您所描述的。
希望这可以帮助