C# - 不区分大小写的正则表达式。用字典替换函数

问题描述 投票:0回答:3

我有这样一句话

My name is [name] and I'm [age] years old

我想用属于字典的内容替换方括号内的文本。我用谷歌搜索了一下,发现了 Regex.Replace 函数,所以我最终得到了这段代码:

string sentence =  "My name is [name] and I'm [age] years old"
string someVariable1 = "John";
string someVariable2 = "34";

var replacements = new Dictionary<string, string>()
        {
            {"[name]", someVariable1},
            {"[age]", someVariable2},
        };

var replaced = Regex.Replace(sentence, string.Join("|", replacements.Keys.Select(k => Regex.Escape(k.ToString()))), m => replacements[m.Value]);

问题是该句子应该是用户输入,我要求在方括号内输入内容以检索一些变量。这就是我关心的地方,有没有办法让方括号内的文本不区分大小写?我的意思是,有没有一种方法,即使有人输入“[NAME]”或“[Name]”而不是“[name]”,它也能完成这项工作?我尝试过使用正则表达式语法,例如@“[[Nn]ame]”和Regex.Options.IgnoreCase,但我无法使其工作。我想这是我理解不正确的地方。

谢谢你。

c# regex dictionary case-insensitive
3个回答
1
投票

似乎您只需要在字典中添加一个不区分大小写的比较器即可。显然,您还需要应用

RegexOptions.IgnoreCase
以便正则表达式 finder 在忽略大小写的情况下进行搜索。

var replacements = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
    {"[name]", someVariable1},
    {"[age]", someVariable2},
};

点网小提琴


0
投票

对于您的场景,应用

RegexOptions.IgnoreCase
将忽略用户输入中 占位符 的区分大小写。

如果您的占位符(即

replacements
字典中的键)初始化为小写,则可以将
m.Value
设置为小写。

replaced = Regex.Replace(sentence, string.Join("|", replacements.Keys.Select(k => Regex.Escape(k.ToString()))), m => replacements[m.Value.ToLower()], RegexOptions.IgnoreCase);

您还可以迭代

replacements
字典中的每个键值对,并在正则表达式匹配时进行替换。

string replaced = sentence;

foreach (var kvp in replacements)
{
    var regex = new Regex(Regex.Escape(kvp.Key), RegexOptions.IgnoreCase);
    if (regex.IsMatch(replaced))
    {
        replaced = regex.Replace(replaced, replacements[kvp.Key]);
    }
}

0
投票

如果你想忽略大小写,只需让.Net知道即可:

string sentence =  "My name is [name] and I'm [age] years old";

string someVariable1 = "John";
string someVariable2 = "34";

// When looking for a key, ignore case
var replacements = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
    {"[name]", someVariable1},
    {"[age]", someVariable2},
};

// Pattern doesn't have letters, so no case policy required
var resplace = Regex.Replace(
    sentence, 
  @"\[[^\]\[]+\]", 
    m => replacements.TryGetValue(m.Value, out string s) ? s : m.Value);

小提琴

我在这里改变了逻辑:我不是构建一个长模式,而是寻找 any

[key]
匹配,其中
key
可以是不包含
[
]
字符的任何字符串,然后查看在字典中查找替换。

图案

\[[^\]\[]+\]
解释:

\[       - [ character
[^\]\[]+ - one or more characters except ']' or '['
\]       - ] character
© www.soinside.com 2019 - 2024. All rights reserved.