Защитить сбежавшие символы от окончания шаблона - PullRequest
0 голосов
/ 02 марта 2020

Предполагается, что у вас есть шаблон "A <(. *?)>"

. В качестве примера используется Java, Pattern, Matcher, matcher.find ().

  • В качестве входных данных у вас есть "A<v1>" -> Шаблон соответствует, и группа (1) имеет значение "v1"

  • В качестве входных данных у вас есть "A<v1>v2>" -> Шаблон соответствует и группа (1) имеет значение "v1" из-за "?" превращение ". *" в нежадное.

Предполагается, что пользователь хочет защитить ввод, как: "A<v1\>v2>", поэтому шаблон должен совпадать, и группа (1) имеет значение "v1>v2".

Таким образом, шаблон должен оставаться «не жадным», но экранированные символы защищают и являются частью значения (группировки).

Обработка шаблона выполняется в "while" l oop, поэтому я хочу найти все вхождения шаблона во входных данных. Таким образом, шаблон должен принимать как можно меньше (не жадный), но может обрабатывать «экранированный» символ (здесь: «>» - это мой конец шаблона)).

Любые подсказки.

Заранее спасибо.

1 Ответ

1 голос
/ 02 марта 2020

Вы можете принять \> в качестве допустимого выражения для соответствия:

A<((\\>|.)*?)>

Группа (\\>|.) будет соответствовать либо символам \>, либо, если это не соответствует, . , Порядок важен, поскольку \> будет соответствовать двум символам, а . соответствует только одному, что означает, что . сожрет символ \, если он появится первым.

Для иллюстрации:

A <   v 1 \> v 2     >
| |   | | |  | |     |
A < ( . . \> . . )*? >

Однако итоговое совпадение будет v1\>v2, поэтому вам потребуется выполнить некоторую обработку после факта, чтобы преобразовать \> в >

Если вы хотите go еще дальше и позволяя экранировать символ \, вы можете использовать класс символов следующим образом:

A<((\\[>\\]|.)*?)>

Что будет соответствовать следующему:

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