2011-02-10 51 views
5

我正在運行一個比較程序,並在一分鐘內直接進行「字符串到字符串」比較,如果它們完全匹配,則輸出它們是匹配的。在Java中是否有這樣的通配符?

好了,我希望能增加一個額外的功能,允許「相似」 ......

因此,例如:

String em1 = "52494646"; 
String em2 = "52400646"; 


if (em1.equals(em2)){ 
    output.writeUTF(dir + filenames[i]); 
} 

這是排序代碼片段的。我希望它跳過了「00」,並且仍然認爲它是「幾乎」相同的數字,並仍然輸出它。

我想像它會看起來像String em2 = "524"+ ## +"646"但很明顯,那只是一個概念

有誰知道是否有辦法有這樣的「通配符」的(一個學期,我已經從單向回升SQL)或者是否有另一種方法來完成這種相似類型處理。

謝謝:)

回答

11

您可以使用正則表達式:

if (em1.matches("524[0-9]{2}646")) { 
    // do stuff 
} 
6

你可以解決它很容易使用正則表達式:

if (em1.matches("524..646")) 

例如。

(該.是代表any character通配符。如果你想限制通配符的數字你可以用\\d取代它。)

這裏是匹配的「0」反對任何字符更一般的變種:

String em1 = "52494646"; 
String em2 = "52400646"; 

if (em1.matches(em2.replaceAll("0", "\\\\d"))){ 
    System.out.println("Matches"); 
} 
+1

你的評價讓我想起了我的舊電腦... – 2011-02-10 14:16:52

+0

+1並提醒我目前一,還不老:) – fmucar 2011-02-10 14:19:30

+0

@ ring0,謝謝。它提醒我現在是時候回去工作了;) – aioobe 2011-02-10 14:25:40

1

通常你可以做明星的組合tsWith,endsWith或包含以查找一個字符串是否以一個字符串開頭,以什麼結尾或是否包含另一個字符串。您可以組合使用這些類似

number.startsWith("524") && number.endsWith("646"); 

使用正則表達式可能是時候更好的選擇95%,但較昂貴。

0

不好意思,我相信apache commons的StringUtil沒有任何通配符操作。

如果我沒有記錯,mysql JDBC連接器上有一個StringUtils類,它有一個用通配符比較字符串的方法。

-Or -

您可以嘗試使用一些模糊邏輯:http://jfuzzylogic.sourceforge.net/html/index.html

1

我覺得跟前面提到的RE解決方案的問題是,你不感興趣的是相同的數字,但對於第三或第四個位置,但是數字相同但是隻有一個/兩個數字。

這是一個更復雜的問題,但你基本上想要爲你的兩個字符串計算http://en.wikipedia.org/wiki/Hamming_distance。衆所周知的算法有很多問題,所以你應該找到很多例子,但是我擔心標準庫不會這樣做。它也是一個for循環和一個計數器,所以你不應該對實現有任何問題 - 你失去了STL可以使用的一些優化潛力(比較兩個字符串的地址,你必須在任何一種情況下比較整個字符串),但沒有更多。

0

爲什麼人們不願意直接寫一個簡單的&直接算法?

boolean equals(String s1, String s2, char wildcard) 

    if(s1.length() != s2.length()) 
     return false; 

    for(int i=0; i<s1.length(); i++) 
     char c1 = s1.charAt(i), c2 = s2.charAt(i); 
     if(c1!=wildcard && c2!=wildcard && c1!=c2) 
      return false; 

    return true; 
0

如果你正在尋找一種不同的方式來表達一個通配符,這裏是一個選項:

String em1 = "52494646"; 
    String em2 = "52400646"; 

    if (em2.startsWith("524")){ 
     output.writeUTF(dir + filenames[i]); 
    } 
相關問題