2010-11-17 13 views
6

所以假設我有:如何在Java中使用單個replaceAll找到兩個字符串通用的字符?

String s = "1479K"; 
String t = "459LP"; 

,我想兩個字符串之間返回

String commonChars = "49"; 

的共同特徵。

顯然,這是可以做到與像一個標準的循環:

String commonChars = ""; 
for (i = 0; i < s.length; i++) 
{ 
    char ch = s.charAt(i); 
    if (t.indexOf(ch) != -1) 
    { 
     commonChars = commonChars + ch; 
    } 
} 

但是我想能夠使用replaceAll做到這一條線。這是可以做到如下:

String commonChars = s.replaceAll("["+s.replaceAll("["+t+"]","")+"]",""); 

我的問題是:是否有可能使用的replaceAll一個調用做到這一點?那麼正則表達式是什麼?我想我必須使用某種預測,但是當我思考時,我的大腦就會變得很糟糕。

回答

4
String commonChars = s.replaceAll("[^"+t+"]",""); 

請注意,您可能需要轉義t中的特殊字符,例如,使用Pattern.quote(t)而不是上面的t

+0

現在我感覺非常愚蠢 – Kidburla 2010-11-17 12:00:06

4

接受的答案:

String commonChars = s.replaceAll("[^"+t+"]",""); 

有一個bug!

如果字符串t有正則表達式元字符怎麼辦?在這種情況下,replaceAll失敗。

See this program爲其中串t中有]]一個例子是一個正則表達式元字符這標誌着字符類的末尾。顯然這個程序不會產生預期的輸出。

爲什麼?

考慮:

String s = "1479K"; 
String t = "459LP]"; 

現在正則表達式將成爲(剛剛替補t):

String commonChars = s.replaceAll("[^459LP]]",""); 

它說更換比459L其他任何字符,P其次一個]什麼也沒有。這顯然不是你想要的。

要解決這些問題,您需要跳過的t。您可以手動完成:

String t = "459LP\\]"; 

regex works fine

使用正則表達式的時候,所以java.util.regex.Pattern類提供了一個名爲quote一個靜態方法可以用來做正是這一點這是一個常見的問題:引用正則表達式,元字符,使他們從字面上對待。

所以在使用replaceAllt你引用它:

t = Pattern.quote(t); 

Program using quote method按預期工作。

+0

這是否意味着我需要做的: 字符串commonChars = s.replaceAll( 「[^」 + Pattern.quote(T)+」 ]」, 「」); 取而代之?這是否仍然會單獨檢查每個角色? – Kidburla 2010-11-21 16:04:46

1
public class common { 

    public static void main(String args[]) { 
     String s = "FIRST"; 
     String s1 = "SECOND"; 
     String common = s.replaceAll("[^" + s1 + "]", ""); 
     System.out.println(common); 
    } 
} 
2

接受的答案不正確。由於replaceAll是一個模式,我們必須考慮語法。 如果s1 = "\\t"會發生什麼?如果s1 = "]{"會發生什麼?

如果所有字符都在範圍[0 - 255],我們可以這樣工作:

  1. byte[] tmp = new byte[255];
  2. 環路中的每個字符在第一串

    for (char c : str1.toCharArray())
    // or use charAt(i) here if (tmp[c] == 0) tmp[c] = 1;

  3. 環第二個字符串中的每個字符

    for (char c : str2.toCharArray()) if (tmp[c] == 1) tmp[c] = 2;

  4. 循環tmp數組,查找值爲2的成員,索引 是我們正在查找的正確字符。

另一種解決方案是使用HashSet.retainAll(Collection<?> c);

相關問題