У меня проблемы с пониманием того, как регулярное выражение может соответствовать тексту, но не включать найденный совпавший текст. Возможно, мне нужно работать с группами, чего я не делаю, потому что обычно я вижу, что используется термин «группы без захвата».
Цель состоит в том, чтобы сказать, что у меня есть запрос в файле журнала, как показано ниже:
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, но первая запись, надеюсь, вопрос задан правильно. Спасибо.