2012-10-22 30 views
0

我有一些現有的文本需要用替換文本替換。要使用的替換文本取決於現有文本。下面是一個簡單的翻譯表,顯示我的問題:帶有多個可能替換的正則表達式

 

    ,'A', ==> ,'Fred', 
    ,'B', ==> ,'Mary', 
    ... and so on... 

很容易匹配原始文本。我遇到問題的部分是替換文本。如您所見,替換文字取決於匹配的文字:如果找到,'A',,我需要用,'Fred',替換它。基本上,我似乎需要一個翻譯表機制。

我正在使用.NET RegEx類。

我明白捕獲匹配並在替換文本中重新使用它們,但我不認爲這會實現。有什麼建議嗎?

+1

'我正在使用.NET RegEx類,但我認爲不重要。「 - >它很重要。根據圖書館的不同,一些操作成爲可能。 – nhahtdh

+0

我對.NET RegEx實現並不熟悉,但我記得使用Perl RegEx嵌入式函數解決了一個類似的挑戰,我只是用自定義子例程替換並傳遞匹配的字符串。我的子例程將處理所有規則。也許在.NET RegEx中有類似的東西? –

回答

1

由於您使用的.NET有兩種做法:

  1. 多重置換:

    string.Replace("A", "Fred"); 
    string.Replace("B", "Mary"); 
    // ... (could use regex based replacement if necessary) 
    
  2. 傳遞一個MatchEvaluator委託Regex.Replace,而不是替換字符串:

    Regex.Replace(input, matchRegexString, match => { 
        // Code that takes a System.Text.RegularExpressions.Match and returns a string 
    }); 
    

    並且委託的返回使用了一個是替代文本。 (還有一個非靜態版本,您可以創建一個Regex實例。)在過去,我已經完成了此操作,以便在字典中循環輸入的基礎上執行基於%key%的替換。

+0

請注意,如果一個替換字符串包含另一個稍後搜索的字符串,則選項1會出現問題。 (比如'A'替換爲'Bert',那麼由於第二行會導致'A => Maryert') –

0

這樣做沒有更換多次,沒有委託/子程序的唯一途徑,我相信,如果替換字符串在你的主題串已經存在「後」也只適用。

替換此:

,'A',(?=.*(Fred))|,'B',(?=.*(Mary)) 

有了這個:

,'$1$2', 

是的,一個相當愚蠢的把戲。 @理查德投票道歉,以表示歉意。