2011-10-05 60 views
12

我需要匹配我的數組中不以「KB」字符串開頭的字符串。 我已經試過這匹配具有正則表達式的字符串忽略的情況下

String[] ar = {"KB_aaa","KB_BBB", "K_CCC", "!KBD", "kb_EEE", "FFFF"}; 
Pattern p = Pattern.compile("[^(^KB)].*"); 

for(String str : ar) 
{ 
    Matcher m = p.matcher(str); 
    if(m.matches()) 
     System.out.println(str); 
} 

但它仍然不能匹配 「K_CCC」。 謝謝

+1

相關討論:http://stackoverflow.com/questions/7659449/jdbc-get-table-list-calling-method-gettables-of-databasemetadata-with-advanced-t – adatapost

回答

7

匹配任何開始KB一個正則表達式是:

^(?!KB).* 

要做到這一點在Java中:

if (str.matches("^(?!KB).*$")) ... 
33

我不會使用RegEx的一切。

for(String str : ar) 
{ 
    if(!str.toUpperCase().startsWith("KB")) 
     System.out.println(str); 
} 
+4

最佳答案我今天讀過。 –

+0

啊,你打敗了我。 +1 –

+0

因爲它不僅可以是KB,而且可以是複雜的表達式,現在我需要這個:) –

5

你不應該使用正則表達式隨處可見。只需創建一個簡單的檢查:

for (String str : ar) 
{ 
    if (!str.toLowerCase().startsWith("kb")) 
     System.out.println(str); 
} 

而且我認爲,這種方法甚至在服務表現更好(需要在你的情況不是性能):

public static boolean accept(String name) 
{ 
    if (name.length() < 2) return true; 
    String sub = name.substring(0, 2); 
    return !sub.equalsIgnoreCase("KB"); 
} 

什麼做第二次的其他事情工作方式?

+0

不,我需要它與正則表達式:)這只是一個簡單的例子,簡單地不匹配字符串,它以KB –

10
String[] ar = {"KB_aaa","KB_BBB", "K_CCC", "!KBD", "kb_EEE", "FFFF"}; 
    Pattern p = Pattern.compile("^KB.*", Pattern.CASE_INSENSITIVE); 

    for(String str : ar) 
    { 
     Matcher m = p.matcher(str); 
     if(!m.matches()) 
      System.out.println(str); 
    } 
21

從你提問的方式來看,我不完全確定你是否希望匹配不區分大小寫。這正則表達式:

(?i)[^k][^b].* 

使用標誌(?我)關閉大小寫敏感性,並應該想要你想要的。

+2

開始,老實說我認爲這是正確的答案 - 我認爲問題在更廣泛的意義上,你如何告訴RE引擎忽略案例 – user1172468

+0

這不是正確的答案。你的模式不會匹配像aw234或vj2345這樣的字符串 – VHS

3

使用正則表達式(?i)^(?!kb).*進行不區分大小寫的匹配。它將避免KB234 Kb * 432,kB2343和kb23445。

相關問題