Вы указали на документы , в которых говорится:
(*ACCEPT)
- это единственный глагол для отслеживания, разрешенный для количественной оценки, так как неадекватная квантификация с минимумом нулевых актов только когда происходит возврат. Рассмотрим, например,
(A(*ACCEPT)??B)C
, где A, B и C могут быть сложными выражениями. После сопоставления «A» устройство сопоставления обрабатывает «B C»; если это не удается, вызывая возврат, (*ACCEPT)
срабатывает, и совпадение завершается успешно. В обоих случаях захватывается все, кроме C. В то время как (*COMMIT)
(см. Ниже) означает «сбой при возврате», повторный (*ACCEPT)
этого типа означает «преуспевание при возврате».
Однако, (*ACCEPT)
, похоже, не относится к возврату , и вы видите это здесь в своем примере. Итак, AC
не может быть сопоставлено с A(*ACCEPT)??B
потому что:
A
в шаблоне соответствует A
в строке, (*ACCEPT)??
пропускается первым, поскольку он лениво определяется B
не может соответствовать C
в строке, и происходит сбой. Вы ожидали, что произойдет возврат, но (*ACCEPT)??
не вызовет возврат .
Более полезный (*ACCPET)
пример использования :
Единственный вариант использования для (*ACCEPT)
, о котором я знаю это когда ветви чередования распределяются в более позднее выражение, которое не требуется для всех ветвей. Например, предположим, что вы хотите сопоставить любой из следующих шаблонов: BAZ
, BIZ
, BO
.
Вы можете просто написать BAZ|BIZ|BO
, но если B
и Z
означают сложные подэлементы, вы, вероятно, будете искать способы учета шаблонов B
и Z
. Первый проход может дать вам B(?:AZ|IZ|O)
, но это решение не учитывает Z
. Другой вариант будет B(?:A|I)Z|BO
, но он заставит вас повторить B
. Этот шаблон позволяет вам вычислять как B
, так и Z
:
B(?:A|I|O(*ACCEPT))Z
Если его двигатель следует за ветвью O, он никогда не совпадает с BOZ
, потому что он возвращает BO
, как только (*ACCEPT)
встречается - это то, что мы хотели.