Подтвердить что ты не робот

Строки соответствия с регулярным выражением в случае игнорирования

Мне нужно сопоставить строки в моем массиве, которые не начинаются с строки "КБ". Я пробовал это

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". Благодаря

4b9b3361

Ответ 1

Регулярное выражение, которое соответствует любому, не начинающемуся с KB, выглядит так:

^(?!KB).*

Сделать это в java:

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

Ответ 2

Я бы не использовал RegEx для всего.

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

Ответ 3

Из того, как сформулирован ваш вопрос, я не совсем уверен, хотите ли вы, чтобы совпадение было нечувствительным к регистру или нет. Это регулярное выражение:

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

использует флаг (? i), чтобы отключить чувствительность к регистру, и должен делать то, что вы хотите.

Ответ 4

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

Ответ 5

Вы не должны использовать 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");
}

Что делают другие из этого второго способа работы?

Ответ 6

Используйте регулярное выражение (?i)^(?!kb).* для нечувствительных к регистру символов. Это позволит избежать KB234 Kb * 432, kB2343 и kb23445.