Регулярное выражение для соответствия нулю или одному вхождению слова в Java

Я написал регулярное выражение для соответствия следующей модели:

Любые символы, сопровождаемые hyphen с последующим number с последующим space с последующим необязательным case insensitive keyword с последующим space сопровождаемый любым char

Например

  1. TXT-234 #comment anychars
  2. TXT-234 anychars

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

(?<issueKey>^((\\s*[a-zA-Z]+-\\d+)\\s+)+)((?i)?<keyWord>#comment)?\\s+(?<comment>.*)

Но вышеупомянутое не захватывает нулевое вхождение '#comment', даже если я указал '?' для регулярного выражения Случай 2 в приведенном выше примере всегда дает сбой, а случай 1 - успешный.

Любые указатели относительно того, что я делаю неправильно?

Спасибо

2 ответа

Решение

#comment не будет соответствовать #keyword, поэтому у вас нет совпадений, попробуйте этот, он должен работать

 ([a-zA-Z]*-\\d*\\s(((?i)#comment|#transition|#keyword)+\\s)?[a-zA-Z]*)

Это может помочь;

String str = "1. TXT-234 #comment anychars";
String str2 = "2. TXT-234 anychars";
String str3 = "3. TXT-2a34 anychars";
String str4 = "4. TXT.234 anychars";
Pattern pattern = Pattern.compile("([a-zA-Z]*-\\d*\\s(#[a-zA-Z]+\\s)?[a-zA-Z]*)");
Matcher m = pattern.matcher(str);
if (m.find()) {
    System.out.println("Found value: " + m.group(0));
    System.out.println("Found value: " + m.group(1));
    System.out.println("Found value: " + m.group(2));
}
m = pattern.matcher(str2);
if (m.find()) {
    System.out.println("Found value: " + m.group(0));
}
m = pattern.matcher(str3);
if (m.find()) {
    System.out.println("Found value: " + m.group(0));
} else {
    System.out.println("str3 not match");
}
m = pattern.matcher(str4);
if (m.find()) {
    System.out.println("Found value: " + m.group(0));
} else {
    System.out.println("str4 not match");
}
Другие вопросы по тегам