Как извлечь подстроку из этой строки с помощью RegEx

У меня есть следующая строка String: dn: cn=Customer Management,ou=groups,dc=digitalglobe,dc=com

Я хочу извлечь именно это из строки выше: Customer Management

Я пробовал следующее выражение RegEx, но оно делает то, что я хочу:

^dn: cn=(.*?),

Вот фрагмент кода Java, который проверяет приведенное выше выражение:

Pattern pattern = Pattern.compile("^dn: cn=(.*?),");
String mydata = "dn: cn=Delivery Admin,ou=groups,dc=digitalglobe,dc=com";

Matcher matcher = pattern.matcher(mydata);
if (matcher.matches()) {
    System.out.println(matcher.group(1));
} else {
    System.out.println("No match found!");
}

Результат: «Совпадений не найдено» ... :(

Ваше регулярное выражение должно работать. Каким образом он не делает то, что вы хотите?

blhsing 16.10.2018 18:31

Вы можете использовать ретроспективный просмотр ((?<=^dn: cn=)[^,]+) или, проще говоря, придерживаться текущего регулярного выражения (или несколько более эффективного ^dn: cn=([^,]+)), но извлекать информацию из его первой группы захвата, однако, возможно, стоит использовать парсер DN.

Aaron 16.10.2018 18:32

@Aaron - Я тоже пробовал смотреть за выражением с помощью приведенного выше кода ... он все еще не найден ... ваше выражение отлично работает в regexpal.com, но не в моем глупом java-коде.

JamesD 16.10.2018 18:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
54
3

Ответы 3

Ваше регулярное выражение должно работать правильно, но matches пытается сопоставить регулярное выражение со строкой весь. Вместо этого используйте метод find, который будет искать совпадение в любой точке строки.

if (matcher.find()) {
    System.out.println(matcher.group(1));
} else {
    System.out.println("No match found!");
}

Ваша проблема в том, что сопоставитель хочет сопоставить вход весь. Попробуйте добавить подстановочный знак в конец шаблона.

Pattern pattern = Pattern.compile("^dn: cn=(.*?),.*");
String mydata = "dn: cn=Delivery Admin,ou=groups,dc=digitalglobe,dc=com";

Matcher matcher = pattern.matcher(mydata);
if (matcher.matches()) {
    System.out.println(matcher.group(1));
} else {
    System.out.println("No match found!");
}

Пожалуйста, используйте нижеприведенный код:

@ ПРИМЕЧАНИЕ: вместо использования совпадений вы должны использовать поиск

public static void main (String [] args) {

Pattern pattern = Pattern.compile("^dn: cn=(.*?),");
String mydata = "dn: cn=Delivery Admin,ou=groups,dc=digitalglobe,dc=com";

Matcher matcher = pattern.matcher(mydata);
if (matcher.find()) {
    System.out.println(matcher.group(1));
} else {
    System.out.println("No match found!");
}

}

Другие вопросы по теме