我需要做一个2规则“替换” - 我的规则是,替换所有开放的parens,“(”用连字符“ - ”并删除所有关闭的parens“)”。
例如:
“foobar(baz2)”将成为
“foobar的-baz2”
我目前这样做 - 但是,我的预感正则表达式会更清晰。
myString.Replace("(", "-").Replace(")", "");
答案 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个有趣的注释:
不错!