Без дополнительной информации о структуре синтаксиса, который у вас есть на данный момент, трудно сказать наверняка, но я думаю, что вы ищете здесь просто простую единственную match
конструкцию, которая соответствует буквальному символу /
сопровождаемый любым символом, который может быть escape-символом, который в вашем примере является символом s
и символом /
.
Вы можете зацикливаться на мысли, что регулярное выражение, которое выПытается создать потребности найти максимально возможное совпадение, содержащее любую комбинацию escape-последовательностей.Однако предоставленные вами правила match
используются столько раз, сколько необходимо для использования входных данных, поэтому им необходимо сопоставлять только отдельные синтаксические конструкции за раз.
Простой пример этого в действии - этоследующий минимальный синтаксис.Первые две конструкции match
приведены только для примера на рисунке ниже;они реализуют строковый комментарий и помечают 's' как особые, когда они не экранированы, чтобы было понятнее в этом случае.
Третье правило - это то, что соответствует допустимой escape-последовательности, которая является /
затем следует либо /
(литерал /
), либо s
(литерал s
).
Последнее правило, которое является необязательным, соответствует символу /
, за которым следует все, что не являетсядопустимый escape-символ (в том числе ничего не сопровождаемый) и помечает его как invalid
как подсказку пользователю, что он сделал что-то глупое.
Здесь я добавил пробел в качестве потенциально допустимого побега для недопустимого обнаружения побега, чтобы конечный пробел, следующий за голым /
, также не получал область действия invalid
.Без этого синтаксис предполагает, что вы пытаетесь заключить в кавычки пробел.
%YAML 1.2
---
scope: source.example
contexts:
main:
# A simple single-line comment scope capture for nice output
- match: '(#).*\n?'
captures:
0: comment.line.number-sign.example
1: punctuation.definition.comment.example
# Just so we can apply a color to the letter s to know when it's "special"
- match: 's'
scope: entity.name.special
# The set of things that can be valid escapes
- match: '/[s/]'
scope: constant.character.escape.example
# If only s and / are valid escapes, make other escapes invalid, including
# using a bare / with nothing following it.
- match: '/[^s/ ]?'
scope: invalid.illegal.escape.example
В простом тесте результаты этого синтаксиса будут такими: