字符串替换的正则表达式模式

5

我有一个句子,"Name # 2",

我需要用"No."替换'#',

最终的句子应该是"Name No. 2"。

代码 -

string sentence = Regex.Replace("Name # 2", "\\#\\b", "No.");

显然,Regex.Replace无法将“#”替换为“No”,有没有一种正确的方法通过正则表达式来解决这个问题。 谢谢 我寻找正则表达式模式的原因是因为有一个通用代码执行,看起来像下面这样
     string pattern = string.Format(@"\b{0}\b", context);

     sentence = System.Text.RegularExpressions.Regex.Replace(sentence, pattern, suggestion);

上下文 - "#"

句子 - "Name # 2"

建议 - "不是"

预期句子 - "Name No. 2"

实际句子 - "Name # 2"

上下文 - "were"

句子 - "He were going"

建议 - "was"

预期句子 - "He was going"

实际句子 - "He was going"

上下文 - "a"

句子 - "He was at a point in time going."

建议 - "z"

预期句子 - "He was at z point in time going"


3
哇!为什么要用正则表达式? - Thomas Weller
@ThomasWeller 我已经编辑了我的问题。 - Sandepku
\b 匹配单词边界(字母数字和其他字符之间)。在您的输入中,该 # 旁边没有这样的边界。 - Hans Kesting
3
编辑仍未解释为什么需要正则表达式。这两种情况似乎都可以通过简单的字符串替换来解决。 - Thomas Weller
@ThomasWeller 我需要替换句子中的"a",例如"He was at a point in time going home",结果我替换了句子中所有可用的'a',因此使用了正则表达式! - Sandepku
4个回答

6

当前的正则表达式如果在 # 前面有一个单词字符、一个字母、一个数字或一个下划线时,将不会匹配。这是因为单词边界的含义取决于上下文。

请使用以下任一修复方法进行替换:

string pattern = string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(context));
                                 ^^^^^^    ^^^^^^

(?<!\w)(?!\w)是与上下文无关的,如果没有单词字符前/后,则匹配单词。

或者,使用

string pattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(context));

为了只匹配空格内的单词,需要使用 (?<!\S) 负向零宽断言来要求单词前面是空格或字符串的开头,同时使用负向预测零宽断言 (?!\S) 来要求单词后面是字符串的结尾或空格。

请注意,在处理用户输入/动态模式构建并需要在正则表达式模式中使用 文字 字符串时必须使用 Regex.Escape。它将转义所有特殊字符(如 ?+ 等),否则会破坏模式。


4
string test = "Name # 2";

test = test.Replace("#", "No.");

抱歉,我需要通过正则表达式进行操作。 - Sandepku
test = Regex.Replace(test, "#", "No."); 将test中出现的"#"替换为"No."。 - mybirthname
@Sandepku,你应该解释一下(编辑你的帖子),为什么你需要使用正则表达式。 - Hans Kesting

3

您可以尝试:

string sentence = Regex.Replace("Name # 2", "#", "No.");

# 不需要转义,因此不需要反斜杠。


2
使用正则表达式可以这样做:
Regex.Replace("Name # 2", "#", "No.")

或者只是一个普通的字符串替换:

"Name # 2".Replace("#", "No.");

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