我有一句话,“名字#2”,
我需要将“#”替换为“否”,
最后一句必须是“第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);
context - “#”
句子 - “名称#2”
建议 - “不。”
预期判决 - “姓名2”
实际句子 - “名称#2”
context - “were”
句子 - “他要去了”
建议 - “是”
期待的句子 - “他要去了”
实际句子 - “他要去了”
上下文 - “a”
句子 - “他正处于某个时间点。”
建议 - “z”
期待的句子 - “他在z时间点去了”
答案 0 :(得分:6)
如果#
前面带有字字符,字母,数字或下划线,则当前正则表达式不会匹配。发生这种情况是因为单词边界含义与上下文有关。
将其替换为以下任何修复程序:
string pattern = string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(context));
^^^^^^ ^^^^^^
(?<!\w)
和(?!\w)
与上下文无关,如果不在前面/后跟单词char,则匹配单词。
或者,使用
string pattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(context));
仅匹配空格内的单词(?<!\S)
负向后看需要空格或字符串的开头在&#34;单词&#34;和负前瞻(?!\S)
之前在&#34; word&#34;。
请注意,当您处理用户输入/动态模式构建并且需要在正则表达式模式中使用 literal 字符串时,Regex.Escape
是必须的。它将逃脱所有可能破坏模式的特殊字符(如?
,+
等)。
答案 1 :(得分:4)
string test = "Name # 2";
test = test.Replace("#", "No.");
答案 2 :(得分:3)
您可以尝试:
string sentence = Regex.Replace("Name # 2", "#", "No.");
#不必转义,因此不需要反斜杠。
答案 3 :(得分:2)
使用Regex可以这样做:
Regex.Replace("Name # 2", "#", "No.")
或者只是一个普通的旧字符串。替换:
"Name # 2".Replace("#", "No.");