Является ли java регулярное выражение соответствия с состоянием? - PullRequest
0 голосов
/ 19 сентября 2019

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019
  1. Да Matcher с состоянием.

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

  3. Matcher не является поточно-ориентированным. javadoc прямо заявляет об этом:

    "Экземпляры этого класса не безопасны для использования несколькими параллельными потоками."

  4. Однако, используя его так, как работает ваш код, должно работать ... при условии , что Matcher был виден только / использовался текущим потоком и не использовался далее (или вниз) стек вызовов.

См. также:


В отличие от этого, Pattern является как поточно-ориентированным, так и неизменным / не сохраняющим состояние.


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

2 голосов
/ 19 сентября 2019

Pattern является поточно-ориентированным, но Matcher - нет.

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

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

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

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

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

...