[英]string “search and replace” using a .NET regex
我需要做一個2規則“替換” - 我的規則是,替換所有開放的parens,“(用連字符” - “並刪除所有關閉的parens”)“。
所以例如:
“foobar(baz2)”將成為
“foobar的-baz2”
我目前這樣做 - 但是,我的預感正則表達式會更清晰。
myString.Replace("(", "-").Replace(")", "");
我不會去RegEx這個 - 你正在做的是正確的。 它清晰明了......正則表達式不太可能使這更簡單或更清晰。 您仍然需要對Replace
進行兩次調用,因為每種情況的替換都不同。
Jamie Zawinski突然出現在我腦海中:
有些人在面對問題時會想“我知道,我會使用正則表達式”。 現在他們有兩個問題。
所以我也認為LBushkin在這種情況下是正確的。 您的解決方案有效且可讀。
您可以使用一個正則表達式在一行中替換這兩個匹配項,但它比兩個單個規則字符串替換更少“寬容”。
例:
用於執行正則表達式所需的代碼將是:
Regex.Replace(myString, @"([^\(]*?)\(([^\)]*?)\)", "$1-$2");
這對於您提供的示例完全正常。 如果在哪里發生了最微小的變化,以及有多少'('和')'字符,那么正則表達式就會破裂。 然后你可以用更多的正則表達式修復它,但它會從那里變得更丑陋和丑陋。
然而,對於更加嚴格的應用程序,正則表達式是一個很棒的選擇。
不。 這非常干凈。
重點是,無論如何你必須有兩個正則表達式,因為你的替換條紋是不同的。
我會說使用你擁有的東西 - 它更易於閱讀/維護。 正則表達式是超級強大的,但有時也非常混亂。 對於這么簡單的事情,我會說甚至不使用正則表達式。
我認為正則表達式會對這種事情有點脆弱。 如果您的.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()...
更干凈.Replace().Replace().Replace().Replace()...
對於這樣一個簡單的場景,正則表達式太過分了。 你擁有的是完美的。 雖然您的問題已經得到解答,但我想發布以證明一個正則表達式模式就足夠了:
string input = "foobar(baz2)";
string pattern = "([()])";
string result = Regex.Replace(input, pattern, m => m.Value == "(" ? "-" : "");
Console.WriteLine(result);
想法是捕獲組中的括號。 我使用[()]
這是一個符合我們所追求的字符類。 請注意,在角色類中,不需要對其進行轉義。 或者,模式可能是@"(\\(|\\))"
在這種情況下,轉義是必要的。
接下來, Replace
方法使用MatchEvaluator,我們檢查捕獲的值是否是開放(
如果是,則返回-
如果不是,我們根據我們的有限模式知道它必須是一個結束)
和我們返回一個空字符串。
這是一個有趣的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個有趣的注釋:
不錯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.