【问题标题】:How I can replace [city] to [City] in string如何在字符串中将 [city] 替换为 [City]
【发布时间】:2020-03-29 13:20:54
【问题描述】:

我想将[city], [cIty], [ciTY], ... 替换为[City]
我认为正则表达式是一个很好的解决方案,但我不擅长正则表达式。

试用过的代码:

var text = "[City] [CIty] [ciTY] [city] [CITy]";

if (text.Contains("[city]"))
{
    //text = text.Replace("[city]", "[City]");
    text = Regex.Replace(text, @"[city]", "[City]");
    textbox.Text = text;

    textbox.SelectionStart = textbox.Text.Length;
    textbox.SelectionLength = 0;
}

输出除外

[城市] [城市] [城市] [城市] [城市]

那不行,因为regex语法没有完成

【问题讨论】:

  • 首先,您需要在搜索中忽略大小写选项,添加为参数:RegexOptions.IgnoreCase。其次,括号必须在正则表达式中进行转义,因为它们通常具有特殊含义:@"\[city\]"
  • 好吧,如果括号是您尝试匹配的一部分,您必须将它们转义以便正则表达式正确解释它们。
  • @Pac0 那也很好用,我该如何解决if (text.Contains("[city]"))
  • @KingStone 检查正则表达式匹配,您可以使用Regex.IsMatch,因为string.Contains 不使用正则表达式。

标签: c# regex replace


【解决方案1】:

三点:

  1. 要匹配文本中的括号[],您需要在正则表达式中对其进行转义:@"\[city\]"

  2. Regex.Replace 中添加忽略大小写RegexOptions.IgnoreCase 的选项

  3. 对于“包含”,它不使用正则表达式。请改用Regex.IsMatch

因此,这会将您问题中的代码变成这样:

var text = textbox.Text;
var pattern = @"\[City\]";

// Will match [city], [cITy], [CITY], but not exactly [City] 
if (Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase) && !Regex.IsMatch(text, pattern))
{
    text = Regex.Replace(text, pattern, "[City]", RegexOptions.IgnoreCase);

    // same code after that 
}

【讨论】:

  • 请使用Regex.IsMatch 更新我的解决方案
  • @KingStone 添加完整示例
  • 另外,我想避免将[City] 替换为[City]
  • @KingStone 你的意思是,如果文本已经完全是[City],你不希望“如果”进入块?然后在 if 中添加一个完全匹配的条件(区分大小写):Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase) && ! Regex.IsMatch(text, @"\[City\]")
  • 运行良好,但是[Keyword][City][keyword] 没有更新为[Keyword][City][Keyword],第二个[keyword] 也被! Regex.isMathch ... 忽略
【解决方案2】:

您需要转义括号,使用Regex.IsMatch 而不是Contains,并使模式大小写密集。您可以在正则表达式模式中执行此操作,但 C# 已构建 RegexOptions,因此您可以使用 IgnoreCase。下面是它的样子:

if(Regex.IsMatch(text, @"\[city\]", RegexOptions.IgnoreCase))
{
    text = Regex.Replace(text, @"\[city\]", "[City]", RegexOptions.IgnoreCase);
}

【讨论】:

    【解决方案3】:

    这是dotnetfiddle

    您需要在正则表达式中转义特殊字符,如括号,您可以在下面的模式字符串中看到。然后,您需要添加正则表达式选项 RegexOptions.IgnoreCase 以在将字符串与模式字符串进行比较时忽略大小写。

            var testText = @"[CIty] [ciTY] [city] [CITy] [City]";
            Console.WriteLine("Original text: " + testText);
    
            var pattern = @"\[City\]";
    
            if(Regex.IsMatch(testText, pattern, RegexOptions.IgnoreCase))
            {
                //use the below updated value as you wish
                var updatedStringVal = Regex.Replace(testText, pattern, "[City]", RegexOptions.IgnoreCase);
                Console.WriteLine("Updated text: " + updatedStringVal);
            }
    
    

    【讨论】:

    • 我的输入值为var testText = @"[CIty] [ciTY] [city] [CITy]";
    • 但是,var testText = @"[City] [CIty] [ciTY] [city] [CITy]"; 不起作用
    • 再次检查,它有效。您是否仍然要求忽略 [City]?如果是这样,您必须将字符串拆分为字符串列表并检查每个拆分元素。如果这是您的要求,我可以为您做,但我在您最初的问题中没有看到要求。
    • 是的,答案就足够了
    • 好的,如果您需要拆分,您能否提供预期的输入字符串,我可以为您设置?我们可以假设字符串元素总是用空格分隔吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2013-11-27
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多