C# -不区分大小写Regex.用字典替换函数

cuxqih21  于 2023-08-08  发布在  C#
关注(0)|答案(3)|浏览(129)

我有一句话是这样的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,但我不能使其工作。我想这是我没有正确理解的事情。

  • 谢谢-谢谢
zynd9foi

zynd9foi1#

看起来你只需要在字典中添加一个不区分大小写的比较器。显然,您还需要应用RegexOptions.IgnoreCase,以便Regex finder 在忽略大小写的情况下进行搜索。

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

字符串
dotnetfiddle

e3bfsja2

e3bfsja22#

对于您的场景,应用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]);
    }
}

u0sqgete

u0sqgete3#

如果你想忽略大小写,只需要让.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);

字符串
Fiddle
我改变了这里的逻辑:而不是建立一个长模式,我正在寻找 any[key]匹配,其中key可以是任何不包含[]字符的字符串,并在字典中查找替换。
模式\[[^\]\[]+\]解释:

\[       - [ character
[^\]\[]+ - one or more characters except ']' or '['
\]       - ] character

相关问题