Почему ошибка сопоставления для строк, полученных или предоставленных во время выполнения в Java?

#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*$");