簡體   English   中英

字符串“搜索和替換”使用.NET正則表達式

[英]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個有趣的注釋:

  • 它不需要復雜的正則表達式,因此您可以獲得更好的性能和更輕松的維護。
  • 與string.Replace實現不同,此方法恰好分配1個字符串。

不錯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM