Почему нет возврата при использовании звезды с отрицательным набором символов - PullRequest
2 голосов
/ 25 марта 2019

На самом деле я понимаю, что такое возвратный путь, то есть состояние, когда двигатель применяет жадный квантификатор, что приводит к отказу другого атома, поэтому двигатель начинает возвращаться к предыдущему состоянию, чтобы постепенно отказаться от совпадений в целях сопоставления оставшихся атомов.

но я получил неожиданное поведение, когда использовал этот шаблон "[^"]*" на этом "abcv, который я написал, чтобы проверить, что происходит при сбое.и я ожидал, что двигатель сделает следующие шаги:

  • двигатель соответствует "
  • , тогда жадно выраженный отрицательный набор символов будет соответствовать abcv
  • , двигатель отказываетчтобы соответствовать последнему "
  • , поэтому он должен вернуться к [^"]*, чтобы бросать символы один за другим, пытаясь соответствовать оставшемуся атому.

, но когда я проверяю этона regex101 двигатель не возвращается назад, но каждый раз запускается из другого положения.так чего мне здесь не хватает?

Это именно то, что ожидалось?если да, объяснит ли кто-нибудь почему?

Обновление

Мне нужно упомянуть, что ".*" возвращается назад, и если вы проверите шаги двигателя, вы обнаружите, что он запускаетсядавать персонажей одного за другим, а тот, у кого проблемы, нет.почему эта разница, в то время как .* и [^"]* являются жадными квантификаторами, которые соответствуют одному и тому же тексту, но один должен был отслеживать, а другой нет.

1 Ответ

2 голосов
/ 25 марта 2019

PCRE использует оптимизацию "автоматического владения" здесь, поскольку он "видит", что нет никакого способа сопоставить любые другие символы кроме " между двумя ".См. PCRE документы :

PCRE_NO_AUTO_POSSESS

  If  this option is set, it disables "auto-possessification". This is an
  optimization that, for example, turns a+b into a++b in order  to  avoid
  backtracks  into  a+ that can never be successful. However, if callouts
  are in use, auto-possessification means that some  of  them  are  never
  taken. You can set this option if you want the matching functions to do
  a full unoptimized search and run all the callouts, but  it  is  mainly
  provided for testing purposes.

Вы можете легко проверить , добавив "[^"]*"с глаголом (*NO_AUTO_POSSESS) PCRE:

enter image description here

...