2016-03-05 30 views
0

我有一個長的字符串S和一個字符串到字符串的映射M,其中M中的鍵是S上的正則表達式匹配的結果。我想要做一個find和 - 替換爲S,其中,每當來自同一個正則表達式的匹配中的一個匹配恰好是M中的一個密鑰K時,我將其替換爲其值M [K]。Regex在另一個正則表達式的匹配結果中使用條件

爲了做到這一點,我想我需要在正則表達式中訪問正則表達式匹配的結果。如果我嘗試在正則表達式之外存儲匹配結果並測試相等性,我無法進行替換,因爲我不知道匹配的位置。我如何完成我的目標?

例子:

S = "abcd_a", regex = "[a-z]", M = {a:b}

結果: 「bbcd_b」,因爲正則表達式將匹配一個的和用B的

S = "abcd_a", regex = "[a-z]*", M = {a:b}

結果替換它們: 「abcd_b」,因爲正則表達式將匹配「abcd」(但不能替換它,因爲它不完全是「a」)和最後的'a'(它將替換它,因爲它完全是「a」)

+1

你使用任何編程語言或任何編輯器? – 2016-03-05 05:01:23

+0

一些編程語言在其正則表達式API中內置了該功能,但不是全部。如果你沒有使用其中的一個,你必須編寫一些代碼,比如[ccf did](http://stackoverflow.com/a/35810582/20938)。那麼,你到底在使用什麼? –

+0

我正在使用Java。我的編輯是崇高的,儘管Java將會進行尋找和替換,而不是編輯。 – Travis

回答

1

編輯感謝AlanMoore的建議。代碼現在更簡單。

我試過使用python(2.7x)來解決這個簡單的例子,但它可以用任何其他語言來實現。最重要的是方法(算法)。希望它能幫助:

import re 
from itertools import cycle 

S = "abcd_a" 
REGEX = "[a-z]" 
M = {'a':'b'} 

def ReplaceWithDict(pattern): 
    # split by match group and map the match against map dict 
    return ''.join([M[v] if v and v in M else v for v in re.split(pattern, S)]) 

print ReplaceWithDict('([a-z])') 
print ReplaceWithDict('([a-z]*)') 

輸出:

bbcd_b 
abcd_b 
+1

如果將正則表達式包含在捕獲組中,則可以跳過'findall()'步驟;你需要的所有東西都在'splits'列表中。 –

+0

@AlanMoore:更新。謝謝! – Quinn

相關問題