Почему Matcher не работает для строк, полученных или предоставленных во время выполнения в Java? - PullRequest
1 голос
/ 17 октября 2011

Привет, я недавно разрабатывал код, в котором мне нужно было извлечь последние 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

Пожалуйста, ответьте, я застрял здесь ??

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Это потому, что когда вы разделяете, у вас есть конечный пробел.

String str = "EGLA 0F 020";
String str2 = "ALT 1F 001 ";
//                       ^ trailing space

Вы можете исправить это несколькими способами. Например:

  • путем разделения на " TO "
  • обрезка результата
  • разрешить конечные пробелы в вашем регулярном выражении.

Например, это изменение будет работать:

String arr[] = def.split(" TO ");
0 голосов
/ 17 октября 2011

Попробуйте этот шаблон:

Pattern pattern = Pattern.compile("[0-9][0-9][0-9]\\s*$"); 

или

Pattern pattern = Pattern.compile("[0-9]{3}\\s*$"); 
0 голосов
/ 17 октября 2011

Если вы заметили, что ваше разделение вступает в силу только для букв "TO", это означает, что шаблон str2 имеет значение "ALT 1F 001 ".

Чтобы решить эту проблему, вы можете попробовать разделить на "\s*TO\s*" вместо "TO"так что любые пробелы, окружающие рабочее ТО, также будут удалены.Другим решением было бы заменить ваш шаблон "[0-9][0-9][0-9]$" на "[0-9][0-9][0-9]" без окончательного $, чтобы он принимал конечные пробелы в вашей строке.

...