Я пытаюсь писать подсветку синтаксиса для Sublime Text, и соответственно работаю с файлом sublime-syntax, где всё пишется на регулярках. Столкнулся с такой задачкой:
Нужно получить строку, которая содержит слово act, при этом перед словом act может быть либо символ фигурной скобки {, либо начало строки, а за ними несколько пробелов. Пришло в голову написать так:
(^|\{)(\s*?)(act)
но, во-первых, это не работает, во-вторых, нутром чую, что это чушь петровна. Можно, конечно, убрать вторую группу и поставить к ^ и \{ соответственно, но на эту группу нужно потом ссылаться. Можно ли решить такую задачу?
Sublime Text насколько я помню работает с Boost Regex.
Пример синтаксиса:
count=count+23
*pl count
act "Действие":
*pl 2345
end
{act "Действие 2":
count=234+567
end}
Пример контекста (не работает для фигурных скобок):
- match: '(^|\{)(\s*?)(act)(?=\s*?.*?\:\s*?$)'
captures:
3: support.function.qsp avs.actionsopen1
push:
- match: ^(\2)(\s*?)(end)([^\&\}]*?)
captures:
2: invalid.illegal.expected-mapping-key.qsp avs.error avs.leftspace
3: support.function.qsp avs.actionsend
4: constant.numeric avs.numberic
pop: true
- include: locations
Как писали ниже в комменте, регулярка работает. Видимо, я тупанул, простите. Вопрос снимаю, так как не работает это именно при поиске act в фигурных скобках. Но это видимо проистекает от моего непонимания разбора стеков в Sublime Text. Чтобы всё работало, я просто написал два разных случая: для начала строки и с look-behind для фигурной скобки.
- match: '(?<=\{)(\s*?)(act)(?=\s*?.*?\:\s*?$)'
captures:
2: support.function.qsp avs.actionsopen1
push:
- match: ^(\1)(\s*?)(end)([^\&\}]*?)
captures:
2: invalid.illegal.expected-mapping-key.qsp avs.error avs.leftspace
3: support.function.qsp avs.actionsend
4: constant.numeric avs.numberic
pop: true
- include: locations
- match: '^(\s*?)(act)(?=\s*?.*?\:\s*?$)'
captures:
2: support.function.qsp avs.actionsopen1
push:
- match: ^(\1)(\s*?)(end)([^\&]*?)
captures:
2: invalid.illegal.expected-mapping-key.qsp avs.error avs.leftspace
3: support.function.qsp avs.actionsend
4: constant.numeric avs.numberic
pop: true
- include: locations