字符串“搜索和替换”使用.NET正则表达式

时间:2010-03-26 19:42:28

标签: c# regex

我需要做一个2规则“替换” - 我的规则是,替换所有开放的parens,“(”用连字符“ - ”并删除所有关闭的parens“)”。

例如:

“foobar(baz2)”将成为

“foobar的-baz2”

我目前这样做 - 但是,我的预感正则表达式会更清晰。

myString.Replace("(", "-").Replace(")", "");

8 个答案:

答案 0 :(得分:7)

我不会去RegEx这个 - 你正在做的是正确的。它清晰明了......正则表达式不太可能使这更简单或更清晰。你仍然需要对Replace进行两次调用,因为每种情况下你的替换都是不同的。

答案 1 :(得分:3)

杰米·扎温斯基突然想起了我的脑海:

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

所以我也认为LBushkin在这种情况下是正确的。您的解决方案有效且可读。

答案 2 :(得分:3)

您可以使用一个正则表达式在一行中替换这两个匹配项,但它比两个单个规则字符串替换更少“宽容”。

示例:

用于执行正则表达式所需的代码将是:

Regex.Replace(myString, @"([^\(]*?)\(([^\)]*?)\)", "$1-$2");

这对于您提供的示例完全正常。如果在哪里发生了最微小的变化,以及有多少'('和')'字符,那么正则表达式就会破裂。然后你可以用更多的正则表达式修复它,但它会从那里变得更丑陋和丑陋。

然而,对于更加严格的应用程序,正则表达式是一个很棒的选择。

答案 3 :(得分:1)

不。这非常干净。

重点是,无论如何你必须有两个正则表达式,因为你的替换条纹是不同的。

答案 4 :(得分:1)

我会说使用你拥有的东西 - 它更易于阅读/维护。正则表达式是超级强大的,但有时也非常混乱。对于这个简单的事情,我会说甚至不使用Regexes。

答案 5 :(得分:1)

我认为正则表达式会对这种事情有点脆弱。如果您的.NET版本具有扩展方法,并且您希望扩展的语法更清晰,则可能会引入如下扩展方法:

public static class StringExtensions
{
    public static string ReplaceMany(this string s, Dictionary<string, string> replacements)
    {
        var sb = new StringBuilder(s);
        foreach (var replacement in replacements)
        {
            sb = sb.Replace(replacement.Key, replacement.Value);
        }
        return sb.ToString();
    }
}

现在你建立你的替换词典......

var replacements = new Dictionary<string, string> { {"(", "-"}, {")", ""} };

并致电ReplaceMany:

var result = "foobar(baz2)".ReplaceMany(replacements); // result = foobar-baz2

如果您确实想表明自己的意图,可以将Dictionary<string,string>别名改为StringReplacements

//At the top
using StringReplacements = System.Collections.Generic.Dictionary<string,string>;

//In your function
var replacements = new StringReplacements() { {"(", "-"}, {")", ""} };
var result = "foobar(baz2)".ReplaceMany(replacements);

只有两个替代品可能有点矫枉过正,但如果你有很多替代品,那么它会比.Replace().Replace().Replace().Replace()...更清洁。

答案 6 :(得分:0)

正则表达式对于这样一个简单的场景来说太过分了。你拥有的是完美的。虽然您的问题已经得到解答,但我想发布以证明一个正则表达式模式就足够了:

string input = "foobar(baz2)";
string pattern = "([()])";
string result = Regex.Replace(input, pattern, m => m.Value == "(" ? "-" : "");
Console.WriteLine(result);

这个想法是捕获一个组中的括号。我使用[()]这是一个与我们所追求的相匹配的角色类。请注意,在角色类中,不需要对其进行转义。或者,模式可能是@"(\(|\))",在这种情况下,必须进行转义。

接下来,Replace方法使用MatchEvaluator,我们检查捕获的值是否为开始(。如果是,则返回-。如果不是,我们根据我们有限的模式知道它必须是一个结束)并且我们返回一个空字符串。

答案 7 :(得分:0)

这是一个有趣的基于LINQ的问题解决方案。它可能不是最佳选择,但无论如何它都是一个有趣的选择:

public string SearchAndReplace(string input)
{ 
   var openParen = '(';
   var closeParen = ')';
   var hyphen = '-';
   var newChars = input
        .Where(c => c != closeParen)
        .Select(c => c == openParen ? hyphen : c);
   return new string(newChars.ToArray());
}

关于此实施的2个有趣的注释:

  • 它不需要复杂的正则表达式,因此您可以获得更好的性能并且更容易 维护。
  • 与string.Replace实现不同,此方法 正好分配1个字符串。

不错!