2015-01-15 87 views
2

我在尋找解壓:正則表達式替換一切,除了一個特定的模式

50%

從一個字符串,將有更多或更少的格式如下:

The 50% is in here somewhere.

我會也喜歡摘錄:

50%50%25%

從這樣的字符串:

50% of 50% is 25%

Regex.Match()似乎是顯而易見的競爭者。但是,這涉及檢查是否找到任何匹配項(例如match.Success),從數組中的特定索引提取結果,和/或處理超出界限索引的風險。

正則表達式替換通常更容易應用。一行代碼完成這項工作,包括返回結果字符串。這對於很多語言都是如此。

result = Regex.Replace(input, stuffWeDontLike, "")

基本上,我要尋找一個正則表達式過濾 - 而不是輸入的模式來取代,我想進入模式檢索

percentages = Regex.Filter("50% of 50% is 25%", "[0-9]+\%")

我們能否形成一個正則表達式和轉化的結果,就好像它是一個選擇?這將允許使用正則表達式替換。但是,我找不到一種方法輕鬆地轉換正則表達式。

如何用非常簡短的語法實現期望的結果(或類似的情況;一個連接似乎是可以接受的),類似於正則表達式替換?

+0

那麼,您是否希望在最後更換或提取?提取是通過使用組(括號)並檢查我想提取的正則表達式Matches.Groups – Kilazur 2015-01-15 16:07:14

+0

來完成的,但是作爲一個單線程。 – Timo 2015-01-19 08:21:31

回答

1

您可以使用Regex.Matches並連接每個匹配結果。選一個你最喜歡的。

//Sadly, we can't extend the Regex class 
public class RegExp 
{ 
    //usage : RegExp.Filter("50% of 50% is 25%", @"[0-9]+\%") 
    public static string Filter(string input, string pattern) 
    { 
     return Regex.Matches(input, pattern).Cast<Match>() 
      .Aggregate(string.Empty, (a,m) => a += m.Value); 
    } 
} 

public static class StringExtension 
{ 
    //usage : "50% of 50% is 25%".Filter(@"[0-9]+\%") 
    public static string Filter(this string input, string pattern) 
    { 
     return Regex.Matches(input, pattern).Cast<Match>() 
      .Aggregate(string.Empty, (a,m) => a += m.Value); 
    } 
} 
+0

單線。正是我所希望的!在多個開發人員的情況下,無論如何,一個片段更合適。我現在插入'Regex.Matches(input,pattern).Cast ().Aggregate(「」,(s,m)=> s + m.Value);'這個解決方案比我的替換濫用更好地傳達意圖,非常簡潔。 – Timo 2015-01-19 08:52:44

1

一種解決方案是使用正則表達式替換如下:

Regex.Replace("50% of 50% is 25%", "(\d+\%)|(?:.+?)", "$1");

輸出:

50%50%25%

作爲一般的方法:

Regex.Replace(input, (pattern)|(?:.+?), "$1");

此查找符合以下任什麼:

  • 模式。捕獲爲$1。這是我們想要保留的。
  • 任何角色,任何次數,但不貪婪。這發現任何而不是由第一組捕獲。 ?:,因爲我們不需要捕獲這個組。

正如MSDN所述:「$1將用第一個捕獲的子表達替換整個匹配。」 (也就是說,該子串的所有匹配,連接在一起)。

實際上,這是描述的正則表達式過濾器

+0

我刪除了我的其他評論。但是......用'(pattern)| .'代替'(pattern)|(?:。+?)'會出錯,然後在替換部分仍然使用'$ 1'? – 2015-07-01 17:48:22

+0

我相信應該工作。我有預感,一個'。+?'會比重複'。'來清除大塊無趣的角色更快,但我很可能錯了。 – Timo 2015-07-02 14:46:58

2

我不明白你的推理你爲什麼要使用替換。爲什麼要這樣呢? Regex類中有方法可以讓您精確地獲得所有需要的匹配。你找到我找到的解決方案的迂迴方式是毫無意義的。

只需使用Matches()來收集匹配。然後你可以將它們加入到你想要的字符串中。

var str = "50% of 50% is 25%"; 
var re = new Regex(@"\d+%"); 
var ms = re.Matches(str); 
var values = ms.Cast<Match>().Select(m => m.Value); 
var joined = String.Join("", values); // "50%50%25%" 
+0

我把它摺疊成String.Join(「」,Regex.Matches(str,@「[0-9] + \%」)。Cast ().Select(m => m.Value));'Preferred最終使用'Aggregate()'的解決方案,因爲它甚至可以在單行上保持邏輯讀取順序。 – Timo 2015-01-19 08:59:31

+0

順便提一下,'[0-9]'不能被'\ d'自由替換,因爲後者也可以匹配阿拉伯數字等。我故意使用了「[0-9]」。 – Timo 2015-01-19 09:01:27

相關問題