Сопоставитель регулярных выражений Java с состоянием?

Я пришел со стороны Python и мало знаю о регулярном выражении Java, вопрос довольно понятен, позвольте мне добавить некоторый сценарий.

Предположим, у меня есть экземпляр с переменной Matcher matcher и такая функция:

public String getMatch(String group) {
    if (matcher.find()) {
        return matcher.group(group);
    } else { blah }
}

Если все группы захвата регулярных выражений названы, вызовет ли это многократный вызов проблемы?


person Rocky Li    schedule 19.09.2019    source источник


Ответы (2)


  1. Да Matcher имеет состояние.

  2. Если что-либо1 вызывает find или match, пока вы (все еще) просматриваете группы (и т. д.) из предыдущего вызова, вы потеряете состояние из предыдущего вызова. То же самое относится к reset и reset(CharSequence), а также к некоторым другим методам. Такое поведение заложено в дизайне API и четко задокументировано.

  3. #P3# <блочная цитата> #P4#
  4. Тем не менее, его использование, как и ваш код, должно работать... при условии, что Matcher был виден/использовался только текущим потоком и не использовался дальше вверх (или вниз) по стеку вызовов.

Смотрите также:


Напротив, Pattern является потокобезопасным и неизменяемым/без сохранения состояния.


1 — это может быть другой поток или текущий поток, использующий один и тот же Matcher в разных точках стека вызовов; то есть через рекурсию или что-то в этом роде.

person Stephen C    schedule 19.09.2019

Pattern является потокобезопасным, а Matcher — нет.

Matcher поддерживает некоторые локальные переменные, такие как groupVars, localVars, last и т. д.

groupVars используется для записи захваченной группы, она будет сбрасываться перед каждой операцией Matcher#match и Matcher#find.

localVars используется для записи контекста операции сопоставления.

last используется find, он представляет смещение терминала предыдущей операции find.

Если вы используете Matcher одновременно, эти локальные переменные будут покрыты другим потоком, что может привести к неожиданному результату.

person sulin    schedule 19.09.2019