Что не так с этим регулярным выражением? - PullRequest
1 голос
/ 04 июля 2010
public class PatternTest {
  public static void main(String[] args) {
    System.out.println("117_117_0009v0_172_5738_5740".matches("^([0-9_]+v._.)"));
  }
}

Эта программа выводит «false». Что?! * * 1002

Я ожидаю совпадения с префиксом строки: "117_117_0009v0_1"

Я знаю эту штуку, правда, знаю ... но ради жизни я смотрел на это в течение 20 минут и перепробовал все варианты, которые только мог придумать, и мне явно не хватает чего-то простого и очевидного. здесь.

Надеясь, что многие глаза СО могут выбрать это для меня, прежде чем я сойду с ума по этому поводу.

Спасибо!


Окончательная рабочая версия выглядела так:

String text = "117_117_0009v0_172_5738_5740";
String regex = "[0-9_]+v._.";

Pattern p = Pattern.compile(regex);

Mather m = p.matcher(text);
if (m.lookingAt()) {
  System.out.println(m.group());
}

Одним неочевидным открытием / напоминанием для меня было то, что перед доступом к группам совпадений необходимо вызвать одну из match () LookingAt () или find (). Если нет, возникает исключение IllegalStateException с бесполезным сообщением «Совпадение не найдено». Несмотря на это, groupCount () по-прежнему будет возвращать ненулевое значение, но это ложь. Не верьте этому.

Я забыл, насколько уродлив этот API. Argh ...

Ответы [ 3 ]

3 голосов
/ 04 июля 2010

по умолчанию Java вставляется в операторы ^ и $, поэтому что-то вроде этого должно работать:

public class PatternTest {
  public static void main(String[] args) {
    System.out.println("117_117_0009v0_172_5738_5740".matches("^([0-9_]+v._.).*$"));
  }
}

возвращается:

правда

Содержимое матча:

117_117_0009v0_1

Это код, который я использовал для извлечения совпадения:

       Pattern p = Pattern.compile("^([0-9_]+v._.).*$");
       String str = "117_117_0009v0_172_5738_5740";

        Matcher m = p.matcher(str);
        if (m.matches())
        {
            System.out.println(m.group(1));
        }
1 голос
/ 04 июля 2010

Если вы хотите проверить, начинается ли строка с определенного шаблона, вы должны использовать Matcher.lookingAt() метод:

Pattern pattern = Pattern.compile("([0-9_]+v._.)");
Matcher matcher = pattern.matcher("117_117_0009v0_172_5738_5740");
if (matcher.lookingAt()) {
  int groupCount = matcher.groupCount();
  for (int i = 0; i <= groupCount; i++) {
     System.out.println(i + " : " + matcher.group(i));
  }
}

Javadoc:

булево java.util.regex.Matcher.lookingAt ()

Попытки соответствовать последовательности ввода, начиная с начала регион, против картины. Словно соответствует методу, этот метод всегда начинается в начале региона; в отличие от этого метода, он не требуют, чтобы весь регион соответствует. Если матч удастся, то больше информации можно получить через методы start, end и group.

0 голосов
/ 04 июля 2010

Я не знаю Java Flavor Regular Expression, однако это регулярное выражение PCRE должно работать ^([\d_]+v\d_\d).+ Не знаю, почему вы используете ._. вместо \d_\d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...