Как сопоставить косую черту или точку в конце строки, но не записать, используя Java регулярное выражение - PullRequest
2 голосов
/ 16 июня 2020

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

Цель состоит в том, чтобы сказать, что у меня есть запрос в файле журнала, как показано ниже:

TICKET / A / ADMIN / 05MAR2020 // только для возврата A / ADMIN / 05MAR2020 или если БИЛЕТ / A / ENGINEERING / 05MAR2020 . только для возврата A / ENGINEERING / 05MAR02020 где "//" или "." был удален

Наконец, чтобы игнорировать такие строки, как:

БИЛЕТ ЗАВЕРШЕН

using regex = "(?<=^TICKET\\s{0,2}/).*(?://|\\.)?

Таким образом, синтаксический анализатор ищет TICKET в начале строки, за которым следует прямой sla sh, но не возвращает TICKET. И ищите либо двойной прямой sla sh "//", либо "." точку в конце строки, но сделайте это необязательным.

Мой Java код 1.8.x:

// used in the import statement: import java.util.regex.Matcher;
//                               import java.util.regex.Pattern;
private static void testRegex() {
    String ticket1 = "TICKET/A/ITSUPPORT/05MAR2020//";
    String ticket2 = "TICKET /B/ADMIN/06MAR2020.";
    String ticket3 = "TICKET/C/GENERAL/07MAR2020";

    //https://www.regular-expressions.info/brackets.html

    String regex = "(?<=^TICKET\\s{0,2}/).*(?://|\\.)?";
    Pattern pat = Pattern.compile(regex);
    Matcher mat = pat.matcher(ticket1);

    if (mat.find()) {
        String myticket = ticket1.substring(mat.start(), mat.end());
        System.out.println(myticket+ ", Expect 'A/ITSUPPORT/05MAR2020'");
    }
    mat = pat.matcher(ticket2);
    if (mat.find()) {
        String myticket = ticket2.substring(mat.start(), mat.end());
        System.out.println(myticket+", Expect 'B/ADMIN/06MAR2020'");
    }

    mat = pat.matcher(ticket3);
    if (mat.find()) {
        String myticket = ticket3.substring(mat.start(), mat.end());
        System.out.println(myticket+", Expect 'C/GENERAL/07MAR2020'");
    }
    regex = "(//|\\.)";
    pat = Pattern.compile(regex);
    mat = pat.matcher(ticket1);
    if (mat.find()) {
        String myticket = ticket1.substring(mat.start(), mat.end());
        System.out.println(myticket+", "+mat.start() + ", " + mat.end() + ", " + mat.groupCount());
    }
}

Мои фактические результаты следующие:

A/ITSUPPORT/05MAR2020//, Expect 'A/ITSUPPORT/05MAR2020
B/ADMIN/06MAR2020., Expect 'B/ADMIN/06MAR2020
C/GENERAL/07MAR2020, Expect 'C/GENERAL/07MAR2020


//, 28, 30, 1

Любое предложение будет признательно. Обратите внимание: я давно учился у StackOverflow, но первая запись, надеюсь, вопрос задан правильно. Спасибо.

1 Ответ

0 голосов
/ 16 июня 2020

Вы можете использовать положительный просмотр вперед в конце шаблона вместо совпадения.

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

Поскольку точка и двойная прямая sla sh не являются обязательными, вы должны сделать .*? не жадным.

(?<=^TICKET\s{0,2}/).*?(?=(?://|\.)?$)

По частям

  • (?<= Положительный просмотр назад, утверждение, что слева - это
    • ^ Начало строки
    • TICKET\s{0,2}/ Сопоставьте БИЛЕТ и символы пробела 0–2, за которыми следует /
  • ) Закрыть просмотр назад
  • .*? Сопоставить любой символ, кроме символа новой строки, 0+ раз, как минимум (не жадный)
  • (?= Положительный просмотр вперед, утверждение, что справа -
    • (?: Группа без захвата для чередования |, потому что за обоими могут следовать $
      • // Сопоставьте 2 косых черты
      • | Или
      • \. Сопоставьте точку
    • )? Закройте строку без захвата e и сделайте ее необязательной
    • $ Подтвердите конец строки
  • ) Закройте позитивный просмотр вперед

In Java

String regex = "(?<=^TICKET\\s{0,2}/).*?(?=(?://|\\.)?$)";

Regex demo 1 | Java демо

1. В демонстрации регулярных выражений Javascript выбрано только для демонстрации


Вывод обновленного шаблона с вашим кодом:
A/ITSUPPORT/05MAR2020, Expect 'A/ITSUPPORT/05MAR2020'
B/ADMIN/06MAR2020, Expect 'B/ADMIN/06MAR2020'
C/GENERAL/07MAR2020, Expect 'C/GENERAL/07MAR2020'
//, 28, 30, 1
...