intellij-idea #webstorm #live-templates
#intellij-idea #webstorm #живые шаблоны
Вопрос:
Я хочу создать живой шаблон для createSelector
:
export const someSelector = createSelector(getThis, getThat, getSomethingElse, (this, that, somethingElse) =>
$END$
)
Я могу заставить его работать довольно хорошо с одним аргументом (например, только getThis
который затем приводит (this)
к аргументам функции стрелки).
// template text
createSelector($someSelector$, ($variable$) => $END$)
// variables
// expression for "variable":
decapitalize(regularExpression(someSelector, "get", ""))
Это корректно работает с одним аргументом, как упоминалось выше, и почти корректно работает с несколькими аргументами, за исключением заглавных букв:
createSelector(getThis, getThat, getSomethingElse, (this, That, SomethingElse) => /* $end$ */)
Я попытался обернуть все это, camelCase
но, конечно, запятые и пробелы исчезли.
Проблема, очевидно, в том, что я обрабатываю всю строку сразу, поэтому вся строка выполняется через любую функцию форматирования строки. Похоже, что нет никакого способа обрабатывать отдельные экземпляры «get» отдельно.
Я попробовал группы захвата, которые, как я действительно думал, будут работать:
decapitalize(regularExpression(someSelector, "get(w )", "$1"))
Но это ничего не заменяет, оно просто копирует все:
createSelector(getThis, getThat, (getThis, getThat) => )
Есть ли какой-либо способ добиться этого?
ОБНОВЛЕНИЕ: я даже изучил Groovy script и написал следующее, которое работает на groovy playground, но получает в WebStorm тот же результат, что и в моем последнем примере выше!
groovyScript("return _1.replaceAll(/get(w )/) { it[1].uncapitalize() };", someSelector)
Комментарии:
1. Поддерживает ли Java (или точнее
regularExpression()
)l$1
в качестве шаблона замены? Живой тест: regex101.com/r/6faVqC/1 Наверное, нет … regular-expressions.info/refreplacecase.html2. «Но это ничего не заменяет, оно просто копирует все целиком:» Не забудьте экранировать
, находясь внутри двойных кавычек
"
—regularExpression(someSelector, "get(\w )", "$1")
3. @LazyOne вот и все! Не стесняйтесь публиковать его в качестве ответа, чтобы я мог пометить его как таковой.
Ответ №1:
Это можно было бы сделать с помощью регулярных выражений .. но Java, похоже, не поддерживает l
модификатор замены (который будет использоваться как l$1
вместо $1
в вашем исходном regularExpression()
коде).
Живой пример (работает в PCRE2, например, в PHP): https://regex101.com/r/6faVqC/1
Документы по заменяющим модификаторам: https://www.regular-expressions.info/refreplacecase.html
В любом случае: все это обрабатывается Java, и вы передаете шаблон регулярных выражений или код GrovyScript в двойные кавычки. Поэтому любые
символы должны быть экранированы.
Вам нужно заменить get(w )
на get(\w )
.
Кажется, что для меня здесь все работает просто отлично (где someSelector
переменная Live Template):
groovyScript("return _1.replaceAll(/get(\w )/) { it[1].uncapitalize() };", someSelector)