tl; dr Можете ли вы собрать несколько значений в одну обратную ссылку?
Я пытаюсь написать подсветку синтаксиса для пакета Textmate, но у меня возникла проблема.
Есть два места, где может появиться объявление типа метода.Первый в объявлении метода:
method name(param1: String, param2: String) -> String { ... }
Второй в общем объявлении типа:
type Name = { name(param1: String, param2: String) -> String }
Поскольку два объявления (от name
до последнего String
) имеют точно такой же синтаксис, я хочу разместить для них одно совпадение в репозитории, например так:
"method_type": {
"match": "(\w+)((\((.*)\))?(\s*(->)\s*(\w+))?)?"
"captures": { ... }
}
Проблема, с которой я столкнулся, заключается в том, как захватить несколько параметров (в настоящее время перехваченных с помощьюзаполнитель .*
).Я мог бы заменить это на это (если у кого-то есть лучшее решение для сопоставления значений, разделенных запятыми, тогда я был бы признателен):
((\w+\s*(:\s*\w+)?\s*,\s*)*\w+\s*(:\s*\w+)?))?
Но проблема с этим заключается в том, что второй захват (все параметрыперед запятыми) соответствует только последнему захвату в соответствии со стандартным поведением регулярного выражения, поэтому только два последних параметра будут захвачены в этом подвыражении.
Вместо этого я не могу использовать маркеры begin
и end
потому что все объявления, кроме начального имени, являются необязательными, поэтому нет четко определенного конца шаблона.Словарь captures
не принимает значения patterns
или include
внутри него.Есть ли способ по отдельности сопоставить все параметров (в отличие от текущего поведения, которое просто сопоставляет их все сразу)?