2011-10-05 12 views
12

Necesito coincidir cadenas en mi matriz que no están comenzando con la cadena "KB". He intentado estoCoincidir cadenas con expresión regular en caso de ignorar

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); 
} 

Pero todavía no partidos "K_CCC". Gracias

+1

Tema relacionado: http://stackoverflow.com/questions/7659449/jdbc-get-table-list-calling-method-gettables-of-databasemetadata-with-advanced-t – adatapost

Respuesta

7

una expresión regular que coincide con todo lo no es a partir de KB:

^(?!KB).* 

hacerlo en java:

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

No usaría RegEx para todo.

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

La mejor respuesta que he leído hoy. –

+0

Ah, me ganaste. +1 –

+0

Porque puede ser no solo KB y puede ser una expresión compleja, por ahora necesito esto :) –

5

No use expresiones regulares en todas partes. Basta con crear una sencilla comprobación:

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

Y pienso, que este método es aún mejor en performace (no se necesita que el rendimiento en su caso):

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

Qué hacer otras cosas de esta segunda ¿manera de trabajar?

+0

No, lo necesito con regex :) Esto es solo un ejemplo simple para simplemente no hacer coincidir las cadenas que están comenzando con 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

De la manera que su pregunta está redactada, no estoy del todo seguro de si desea que el partido sea sensible a mayúsculas o no. Esta expresión regular: (? I)

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

utiliza la bandera para apagar mayúsculas y minúsculas, y debe hacer lo que desea.

+2

honestamente, creo que esta es la respuesta correcta. Creo que la pregunta es más amplia en el sentido de cómo le dices al Motor RE para ignorar el caso – user1172468

+0

Esta no es la respuesta correcta. Su patrón NO coincidirá con una cadena como aw234 o vj2345 – VHS

3

Utilice la expresión regular (?i)^(?!kb).* para distinguir entre mayúsculas y minúsculas. Evitará KB234 Kb * 432, kB2343 y kb23445.

Cuestiones relacionadas