Совпадение нескольких записей в регулярном выражении пакета Textmate - PullRequest
1 голос
/ 19 января 2012

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 внутри него.Есть ли способ по отдельности сопоставить все параметров (в отличие от текущего поведения, которое просто сопоставляет их все сразу)?

...