查找正则表达式以匹配特定单词

3
我将尝试找到一个正则表达式来匹配精确的单词并用另一个单词替换它。但是,我使用的表达式会替换以特定字符@开头的单词。
以下是我的代码:
static public string ReplaceWholeWord(this string original, string wordToFind, string replacement, RegexOptions regexOptions = RegexOptions.None){
       string pattern = String.Format(@"\b{0}\b", wordToFind);
       string ret = Regex.Replace(original, pattern, replacement, regexOptions);
       return ret;
}

这是结果:
var input = "if(@test is not null)";
input.ReplaceWholeWord("test", "x");

结果:如果(@x不是null)

目前,我只需要避免匹配那些前面有@字符的单词。


1
@t之间存在着一个单词边界。如果您想仅替换由空格包围的单词,请尝试使用@"(?<!\S){0}(?!\S)"。在这种情况下,您认为什么是单词边界?或者您是否只想在@后面避免匹配?然后请使用@"\b(?<!@){0}\b" - Wiktor Stribiżew
@WiktorStribiżew,我认为if(test ...)中的test应该被替换,这样(?<!\S)...就无法匹配。我们需要澄清要求并明确说明哪些字符被视为“单词的一部分”,哪些字符不是。 - Dmitry Egorov
@MoezRebai,请明确说明哪些字符被认为是“单词的一部分”,哪些字符不是。 - Dmitry Egorov
目前,我只需要丢弃@字符,并且使用@WiktorStribiżew的建议似乎可以解决问题。 - Moez Rebai
1个回答

3

如果您只想避免匹配紧跟着 @ 符号的整个单词,您只需要添加一个负向回顾后发断言

@"\b(?<!@){0}\b"
    ^^^^^^

请查看正则表达式演示
这个正则表达式会首先匹配一个单词边界位置,然后它会检查前一个字符,如果是“@”,则整个匹配将失败。只有在前面的字符不是“@”时,匹配到带有尾随单词边界的“test”。

我喜欢第二种解决方案,它基本上像魔术一样奏效,谢谢。 - Moez Rebai
如果你需要避免匹配以 # 开头的单词,可以将不想匹配的字符放入字符类中,并使用 @"\b(?<![@#]){0}\b"。如果你计划避免匹配具有一些序列字符的单词,请使用交替,例如 @"\b(?<![@#]|==\s*){0}\b"(即未以 == 和 0+ 空格开头的单词)。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接