Ответ 1
Регулярное выражение, которое соответствует любому, не начинающемуся с KB, выглядит так:
^(?!KB).*
Сделать это в java:
if (str.matches("^(?!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". Благодаря
Регулярное выражение, которое соответствует любому, не начинающемуся с KB, выглядит так:
^(?!KB).*
Сделать это в java:
if (str.matches("^(?!KB).*$")) ...
Я бы не использовал RegEx для всего.
for(String str : ar)
{
if(!str.toUpperCase().startsWith("KB"))
System.out.println(str);
}
Из того, как сформулирован ваш вопрос, я не совсем уверен, хотите ли вы, чтобы совпадение было нечувствительным к регистру или нет. Это регулярное выражение:
(?i)[^k][^b].*
использует флаг (? i), чтобы отключить чувствительность к регистру, и должен делать то, что вы хотите.
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);
}
Вы не должны использовать RegExes везде. Просто создайте простую проверку:
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");
}
Что делают другие из этого второго способа работы?
Используйте регулярное выражение (?i)^(?!kb).*
для нечувствительных к регистру символов. Это позволит избежать KB234 Kb * 432, kB2343 и kb23445.