2013-10-13 52 views
0

我正在從包含以下兩行的文件中讀取:「hello hi」和「hii hey」。 每行的第一個字符串是正則表達式,第二個字符串是替換字符串,即String.replaceAll(「hello」,「hi」)。我應該通過文件中的每一行來替換字符串中的正則表達式。但有一個問題。處理後的字符不應再次被替換。String.replaceAll()方法:如何確保處理的字符不能再被替換

例如,我有這個字符串:「helloi」。 第一行後,我有「hii」。 第二行後,天真的方法會導致「嘿」。

我想確保「hii」仍然保持爲「hii」,因爲它已經包含處理過的字符。

請注意,我使用的字符串作爲示例(「helloi」)只是一個簡單的字符串,實際的字符串將很大並且包含多行。

你如何實現它?

編輯:讓我用一個例子來更清楚地解釋我的情況。我有一個字符串「helloi hii」。在文件的第一行之後,我有「hii hii」。但在第二行之後,我會有「hii嘿」。第一個「hii」包含已處理的字符,因此它不會被替換

+0

您執行1遍所有替換。 –

+0

好主意。但是,你如何實現它?我的方法是迭代文件中的所有行,不可避免地,字符串中的某些字符將不止一次被替換。 – uohzxela

+0

如上所述,該要求沒有意義。你似乎只想匹配每一行中的第一個標記與它自己。你完全可以從每行刪除第一個標記,而不用擔心它是什麼,正則表達式,替換等等。 – EJP

回答

1

我想你每次打電話String.replaceAll時,應該將搜索和替換字符串插入HashSet。在您致電String.replaceAll之前,請檢查此HashSet中是否存在搜索和替換字符串。

只有當搜索字符串和替換字符串都不存在於HashSet中時,纔會調用String.replaceAll

// at start 
Set<String> processed = new HashSet<String>(); 

// read file line by line and have this inside your file processing loop 

if (!processed.contains(search) && !processed.contains(replacement)) { 
    String repl = line.replaceAll(search, replacement); 
    processed.add(search); 
    processed.add(replacement); 
} 
+0

感謝您的輸入。但是我正在尋找方法來防止字符串中的字符被多次替換,而不是將搜索替換對的使用限制爲一次性使用。實際上,我的實際字符串非常大,包含多行,因此可能會多次調用搜索替換對來替換字符串中的其他可行字符。 – uohzxela

+0

其實我不是想限制一對,否則我會提示地圖。我認爲根據你的描述,你可能只需要檢查HashSet中的搜索字符串,以便相同的搜索不會再被替換。 – anubhava

+0

對不起,如果我不夠清楚。讓我用一個例子來更清楚地解釋我的情況。我有一個字符串「helloi hii」。在文件的第一行之後,我有「hii hii」。但在第二行之後,我會有「hii嘿」。第一個「hii」包含經過處理的字符,因此它不會被替換 – uohzxela

1

不完全確定我明白了,但是您可以使用字符串屬性和布爾屬性來表示自己的類是否已被修改?將你的字符串拆分成一個該類的數組並處理每一個。

1

String.replaceAll()可能不會爲你做這項工作。

我建議類似這樣的僞代碼

replacements -> HashMap<String, String> 
StringBuffer result 
regexStr = "(" 
for each key in replacements 
    regexStr += key + "|" //key MUST not have any regex syntax or must be properly escaped 
regexStr remove last '|' append ")" 
Matcher m = Pattern.compile(regexStr).matcher() 
while(matches) { 
    get next match 
    result.append(match group 1) 
    result.append(replacements.get(match group 2)) 
} 

本質的東西:

保持地圖上所有替換的:

hi->woah 
hello->hi 
hey->what's up 
what\'s up->fun 

您搜索匹配的正則表達式字符串(.*?)(hi|hello|hey|what\'s up),這是所有的地圖鍵(即你想要搜索的東西)。因爲正則表達式字符串需要知道以逃脫012.每個迭代,看看被捕獲的是什麼,\最終會以Java文字結尾爲"what\\s up"。第一組是自上次比賽以來的一切。第二組是要替換的詞/短語。如果單詞「嗨」,你想用「哇」替換它,所以在你的地圖中查找替換爲「嗨」。

相關問題