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

标签 c# regex

我有一个句子,“名字#2”,

我需要用“否”替换“#”,

最后一句必须是“2号姓名”。

代码-

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

显然 Regex.Replace 未能将“#”替换为“否”,是否有通过正则表达式解决问题的正确方法。 谢谢 我正在寻找正则表达式模式的原因是因为有一个通用代码可以执行,如下所示

     string pattern = string.Format(@"\b{0}\b", context);

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

上下文 - “#”

句子 - “名字#2”

建议 - “不。”

预期句子-“2号姓名”

实际句子 - “名字#2”

上下文 - "is"

句子 - “他要去”

建议 - "is"

预期的句子 - “他要去”

实际句子 - “他要去”

上下文 - “a”

句子 - “他正处于某个时间点。”

建议 - “z”

预期句子 - “他在 z 时间点”

最佳答案

如果 # 则当前正则表达式将不匹配以 word 字符、字母、数字或下划线开头。发生这种情况是因为单词边界的含义取决于上下文。

将其替换为以下任何修复:

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

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

或者,使用

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

仅匹配空格内的单词作为 (?<!\S)负向后视需要在“单词”之前的空格或字符串的开头,以及负向先行 (?!\S)需要在“单词”之后的字符串或空格结束。

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

关于c# - 字符串替换的正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40719641/

相关文章:

regex - Vim netrw_list_hide 的行为与普通正则表达式不同

php - preg_replace 密码过滤器

python - 在 python 上使用正则表达式进行复杂的数据清理

PHP 正则表达式忽略以双下划线开头的文件

c# - 组织大型 C# 解决方案

c# - MySQL 检查用户是否存在 C#

c# - 在没有浏览器发出弹出警告的情况下打开新窗口

c# - 如何更改 C# 文本文件中的未知数字?

c# - cms.dll 中出现 'System.ArgumentException' 类型的异常,但未在用户代码中处理

MySQL MATCH AGAINST 使用通配符返回带有撇号的意外结果