2010-08-04 82 views
1

我想剛剛擺脫重複的連續字從一個文本文件,並有人提到,我可以做這樣的事情:模式,匹配在Java中,正則表達式的幫助

Pattern p = Pattern.compile("(\\w+) \\1"); 
StringBuilder sb = new StringBuilder(1000); 
int i = 0; 
for (String s : lineOfWords) { // line of words is a List<String> that has each line read in from txt file 
Matcher m = p.matcher(s.toUpperCase()); 
// and then do something like 
while (m.find()) { 
    // do something here 
} 

我試圖尋找查看是否可以創建一個新的字符串,或刪除匹配項所在的項目,但我不確定在閱讀文檔後它是如何工作的。例如,作爲一個測試案例,看看它是如何工作的,我所做的:

if (m.find()) { 
System.out.println(s.substring(i, m.end())); 
    } 

若要在文本文件:This is an example example test test test.

爲什麼我的輸出This is

編輯:

,如果我有一個AraryList lineOfWords從線.txt文件中讀取每一行,然後我創建一個新的ArrayList來保存修改後的字符串。例如

List<String> newString = new ArrayList<String>(); 
for (String s : lineOfWords { 
    s = s.replaceAll(code from Kobi here); 
    newString.add(s); 
} 

但它不會給我新的,但原來的s。是因爲淺而深的複製?

+0

第二個片段中的「i」是什麼?在你顯示的代碼中沒有任何其他地方的痕跡... – 2010-08-04 04:48:24

+0

對不起,我等於0,將它添加回來。 – Crystal 2010-08-04 04:50:20

+0

嗨,水晶。最好在這種情況下提出一個新問題,這實際上是另一個問題的另一個問題。 (在相關說明中 - 當我學習Java時,它沒有泛型,也沒有foreach循環':P') – Kobi 2010-08-06 09:26:39

回答

3

試着這麼做:

s = s.replaceAll("\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

這正則表達式是比你強一點 - 它會檢查整個單詞(沒有部分匹配),並擺脫任何數量的連續重複的。
正則表達式會捕獲第一個單詞:\b(\w+)\b,然後嘗試匹配該單詞的空格和重複:(\s+\1)+。最後的\b是爲了避免\1的部分匹配,如在"for formatting"中那樣。

+0

幫助了很多。有沒有辦法檢查不同情況的事情?像「測試測試」? – Crystal 2010-08-05 04:03:27

+0

@水晶 - 謝謝!您可以在正則表達式的開頭添加'(?i)',以使其不區分大小寫,這似乎是'replaceAll'的標準解決方案。 – Kobi 2010-08-05 04:16:50

+0

另一個問題科比如果你有第二個,如果我從一個測試文件循環了一個Arraylist,並且如果我做了一個foreach循環來遍歷它,就像(String s:lineOfWords){s = s.replaceAll ...,那麼我將如何將這個新的「s」添加到我的新ArrayList中以返回。我認爲這與淺與深拷貝有關,但不確定。我在上面的第一個問題中嘗試了僞代碼。謝謝! – Crystal 2010-08-06 01:09:14

1

第一場比賽是「Th IS IS一個例子...」,因此m.end()指向第二個「is」的結尾。我不知道你爲什麼使用i作爲起始索引;改爲嘗試m.start()

要改進您的正則表達式,請在該單詞前後使用\b來指示應該有單詞邊界:(\\b\\w+\\b)。否則,正如你所看到的,你會在文字中找到匹配。