Шаблон регулярного выражения для создания соответствующего поведения escape-символа - PullRequest
0 голосов
/ 21 ноября 2018

Я делаю определение языка Sublime Text 3 для подсветки синтаксиса.Язык - это простой «язык выражений» (не имеющий отношения к Java), который используется для отображения информации из библиотеки мультимедиа на панели дисплея.Цель подсветки синтаксиса состоит в том, чтобы уточнить, что именно будет отображаться на панели.

Соответственно, я хотел бы точно объяснить, как будет выглядеть последовательность escape-символов при интерпретации и отображении на панели дисплея.Экранирующий символ - это косая черта, и если вы хотите отобразить буквальную косую черту, вы должны экранировать ее другим.Таким образом, серия прямых косых черт приведет к тому, что на панели будут отображаться все остальные косые черты.Кроме того, если после косой черты есть специальный символ, он будет экранирован, но если после двух косых черт (или четырех, или шести ...) специальный символ будет добавлен, он не будет экранирован, посколькусимволы будут гасить друг друга.

Подсветка, которую я хотел бы добиться (с примером специального символа 's), выглядит следующим образом:

Desired Highlighting

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

Возможно ли это?Если да, то как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Без дополнительной информации о структуре синтаксиса, который у вас есть на данный момент, трудно сказать наверняка, но я думаю, что вы ищете здесь просто простую единственную 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

В простом тесте результаты этого синтаксиса будут такими:

Syntax example

0 голосов
/ 24 ноября 2018

Хорошо, так что за то, что это стоит, я понял это.Это:

%YAML 1.2
---

file_extensions:
  - example

  scope: source.example

  contexts:
    main:
    # special color setup #

    - match: s
      scope: green


    # desired behaviour #

      - match: '(/)(.)?'
        captures:
          1: grey
          2: white

Дает вам это:

Appropriate representation of escape character behaviour

0 голосов
/ 21 ноября 2018

Поиск нечетного количества слешей не особенно полезен.Это разбор упражнений по удалению слешей.Если за косой чертой следует еще одна косая черта, это буквальная косая черта, в противном случае все, что следует за ней.

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

Сопоставьте все пары "slash-anychar" с помощью регулярного выражения /(.) и замените его на захваченный символ.

В java:

str = str.replaceAll("/(.)", "$1");

В python:

str = re.sub('/(.)', '$1', str)

В perl:

$str =~ s/\/(.)/$1/

и т. Д.

...