AleksVersus
@AleksVersus
графоман

Нужна регулярка с альтернативой между началом строки и неким символом. Можно ли написать такую?

Я пытаюсь писать подсветку синтаксиса для 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
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
AleksVersus
@AleksVersus Автор вопроса
графоман
Как правильно заметил vreitech, регулярка работает.

Ошибка проистекает от моего непонимания того, как Sublime Text разбирает текст внутри стека (я уже задавал вопрос по этому поводу здесь на Хабре, извиняюсь). Он не рассматривает этот текст непосредственно как отдельную строку, отсюда влияние фигурных скобок на подсветку кода внутри самих скобок. В шапке я написал, как решил проблему. Это совсем не изящно и похоже на костыль, но я не могу придумать другого решения.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
(?:^|{)\s*?(act)
Фигурную скобку экранировать не нужно (хотя хз, может в sublime какой-то диалект, для которого нужно)
https://regex101.com/r/iaAEvV/2

Вы бы набросали какй-то пример синтаксиса с котороым работаете. почему вы пшете, что не работает сейчас?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы