#java #regex #string #pattern-matching #matcher
#java #регулярное выражение #строка #сопоставление с образцом #сопоставитель
Вопрос:
Привет, я недавно разрабатывал код, в котором мне приходилось извлекать последние 3 группы цифр. Поэтому я использовал шаблон для извлечения данных. Но я не понял. МОЖЕТ ли кто-нибудь помочь мне понять это??
String str ="EGLA 0F 020";
String def = "ALT 1F 001 TO ALT 1F 029";
String arr[] = def.split("TO");
String str2 = arr[0];
System.out.println("str2:" str2);
Pattern pt = Pattern.compile("[0-9][0-9][0-9]$");
Matcher m1 = pt.matcher(str);
Matcher m2 = pt.matcher(str2);
boolean flag = m1.find();
boolean flag2 = m2.find();
if(flag)
System.out.println("first match:::" m1.group(0));
else
System.out.println("Not found");
if(flag2)
System.out.println("first match:::" m2.group(0));
else
System.out.println("Not found");
Результат, полученный для приведенного выше кода, выглядит следующим образом:::
str2:ALT 1F 001
first match:::020
Not found
Пожалуйста, ответьте, что я застрял здесь??
Ответ №1:
Это потому, что при разделении у вас остается пробел.
String str = "EGLA 0F 020";
String str2 = "ALT 1F 001 ";
// ^ trailing space
Вы можете исправить это несколькими способами. Например:
- путем разделения на
" TO "
- обрезка результата
- разрешение конечных пробелов в вашем регулярном выражении.
Например, это изменение будет работать:
String arr[] = def.split(" TO ");
Ответ №2:
Если вы заметили, что ваше разделение вступает в силу только для букв "TO"
, это означает, что шаблон str2 есть "ALT 1F 001 "
.
Чтобы решить эту проблему, вы можете попытаться разделить на "s*TOs*"
, а "TO"
не так, чтобы все пробелы, окружающие работу, тоже были удалены. Другим решением было бы заменить ваш шаблон "[0-9][0-9][0-9]$"
на "[0-9][0-9][0-9]"
without the final $
, чтобы он принимал конечные пробелы в вашей строке.
Ответ №3:
Попробуйте этот шаблон:
Pattern pattern = Pattern.compile("[0-9][0-9][0-9]\s*$");
или
Pattern pattern = Pattern.compile("[0-9]{3}\s*$");