perl регулярное выражение A (* ПРИНЯТЬ) ?? B - PullRequest
1 голос
/ 02 февраля 2020

Я хочу соответствовать «AB», если позади «A» нет B, только совпадение «A»

Я использовал perl регулярное выражение: A(*ACCEPT)??B

Strings "AB "это хорошее совпадение, но" A C "не возвращает" A ". Почему?

Я знаю альтернативу, но хочу понять (* ACCEPT) с квантификатором.

Is это я что-то не так понимаю? Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Вы указали на документы , в которых говорится:

(*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) встречается - это то, что мы хотели.

0 голосов
/ 02 февраля 2020

Вот регулярное выражение, которое будет соответствовать только «A» из «A C», но будет соответствовать всему «AB»:

AB?

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

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