2017-04-25 106 views
1

我正在處理twitter數據規範化。 Twitter用戶經常使用像我愛你這樣的術語來強調愛這個詞。我希望通過替換重複字符來將這些重複的字符替換爲正確的英語單詞,直到我得到一個合適的有意義的單詞(我意識到我不能通過這種機制區分善與惡)。替換java中的連續重複字符

我的策略是

  1. 識別這些重複的字符串的存在。我會尋找超過2個相同的字符,因爲可能沒有超過兩個重複字符的英文單詞。

    String[] strings = { "stoooooopppppppppppppppppp","looooooove", "good","OK", "boolean", "mee", "claaap" }; 
    
    String regex = "([a-z])\\1{2,}"; 
    Pattern pattern = Pattern.compile(regex); 
    
    for (String string : strings) { 
        Matcher matcher = pattern.matcher(string); 
        if (matcher.find()) { 
         System.out.println(string+" TRUE "); 
        } 
    } 
    
  2. 搜索這樣的話像WORDNET

    一個詞彙
  3. 全部替換,但兩個這樣的重複字符和詞彙檢查
  4. 如果不是有在詞典中刪除一個多重複的字符(否則把它拼寫錯誤)。

由於我的Java知識欠佳,我無法管理3和4.問題是我無法替換除了兩個重複的連續字符之外的所有字符。 下面的代碼替換所有,但一個重複的字符System.out.println(data.replaceAll("([a-zA-Z])\\1{2,}", "$1"));

幫助需要找出 A.如何更換所有,但連續2個重複字符 B.如何從 的輸出中刪除一個更連續的字符[我認爲B可以通過以下代碼片段來管理]

System.out.println(data.replaceAll("([a-zA-Z])\\1{1,}", "$1")); 

編輯:由Wiktor提供的解決方案Stribiżew在Java中完美工作。我想知道需要做什麼修改才能在python中獲得相同的結果。 Python使用re.sub。

+1

不是['.replaceAll(正則表達式,「$ 1 $ 1」)'](http://ideone.com/xt8g72)適合你嗎?然後,'.replaceAll(正則表達式,「$ 1」)'只會保留1. –

+0

太棒了!有用。 .replaceAll(正則表達式,「$ 1 $ 1」)只剩下兩個連續的字符。請解釋$ 1 $ 1是如何工作的。 – Dibs

回答

1

您的正則表達式([a-z])\\1{2,}匹配並捕獲到第1組的ASCII字母,然後匹配該值的兩次或多次出現次數。所以,你需要用一個反向引用代替,$1,它保存捕獲的值。如果您使用一個$1,則aaaaa將替換爲單個a,如果您使用$1$1,則將替換爲aa

String twoConsecutivesOnly = data.replaceAll(regex, "$1$1"); 
String noTwoConsecutives = data.replaceAll(regex, "$1"); 

請參閱Java demo

如果您需要使您的正則表達式不區分大小寫,請使用"(?i)([a-z])\\1{2,}"或甚至"(\\p{Alpha})\\1{2,}"。如果必須處理任何Unicode字母,請使用"(\\p{L})\\1{2,}"

+0

僅僅爲了學術上的興趣,如果我想除了3個重複的字符都被替換,那麼.replaceAll的替換字符串參數是什麼。 – Dibs

+0

您能否提供樣本字符串和預期輸出? –

+0

有一個問題。如果字符串是「stoooooopppppppppppppppppppp」;以上正則表達式只適用於重複出現的第一次,我們得到一個像stoopp這樣的輸出。正確的輸出應該是stoooppp。 – Dibs