Соответствует одному символу, не заключенному в фигурные скобки - PullRequest
0 голосов
/ 21 сентября 2018

Я создаю файл определения синтаксиса списка свойств (tmLanguage) для практики.Это в формате YAML Sublime Text, но я буду использовать его в VS Code.

Мне нужно сопоставить все символы (включая неопределенные { и }), которые не заключены в {}.

Я пытался использовать отрицательные утверждения lookahead и lookbehind, но он просто не соответствует первому или последнему символу в скобках.

(?<!{).(?!})

Добавление жадного квантификатора для использования всех символов просто соответствует полномуline.

(?<!{).+(?!})

Добавление ленивого квантификатора просто соответствует всему, кроме первого символа после {.Он также точно соответствует {}.

(?<!{).+?(?!})

| Test              | Expected Matches        |
| ----------------- | ----------------------- |
| `{Ctrl}{Shift}D`  | `D`                     |
| `D{Ctrl}{Shift}`  | `D`                     |
| `{Ctrl}D{Shift}`  | `D`                     |
| `{Ctrl}{Shift}D{` | `D` `{`                 |
| `{Ctrl}{Shift}D}` | `D` `}`                 |
| `D}{Ctrl}{Shift}` | `D` `}`                 |
| `D{{Ctrl}{Shift}` | `D` `{`                 |
| `{Shift`          | `{` `S` `h` `i` `f` `t` |
| `Shift}`          | `S` `h` `i` `f` `t` `}` |
| `{}`              | `{` `}`                 |

Пример текстового файла: https://raw.githubusercontent.com/spikespaz/windows-tiledwm/master/hotkeys.conf


Полная подсветка синтаксиса:

# [PackageDev] target_format: plist, ext: tmLanguage
---
name: Hotkeys Config
scopeName: source.hks
fileTypes: ["hks", "conf"]
uuid: c4bcacab-0067-43db-a1d7-7a74fffe2989

patterns:
- name: keyword.operator.assignment
  match: \=
- name: constant.language
  match: "null"
- name: constant.numeric.integer
  match: \{(?:Alt|Ctrl|Shift|Super)\}
- name: constant.numeric.float
  match: \{(?:Menu|RMenu|LMenu|Tab|Enter|PgUp|PgDown|Ins|Del|Home|End|PrntScr|Esc|Back|Space|F[0-12]|Up|Down|Left|Right)\}
- name: comment.line
  match: \#.*
...

1 Ответ

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

Вы можете использовать следующий RegEx для сопоставления:

(?:{(Ctrl|Shift|Alt)})*

Затем просто замените совпадения на пустую строку, и вы получите в соответствии с вашими пожеланиями.

RegEx самоочевидно, но вот краткое описание:

Создает non capturing Group, состоящий из одной из ваших клавиш-модификаторов в фигурных скобках.Знак «+» справа означает, что он повторяется один или несколько раз.

...