Могу ли я исключить Положительные Lookaheads и Lookbehinds из фрагмента в vscode? - PullRequest
2 голосов
/ 03 июля 2019

У меня проблемы с исключением частей строки в фрагменте VSCode.По сути, то, что я хочу, это конкретный фрагмент пути, но я не могу заставить регулярное выражение исключить то, что мне нужно исключить.

Я недавно задал вопрос о чем-то похожем, что вы можете найти здесь: Есть ли способ обрезать TM_FILENAME, кроме использования TM_FILENAME_BASE?

Как вы можете заметить, меня в основном сбивает с толку то, как работают фрагменты внутри vscode, а не столько самих регулярных выражений

${TM_FILEPATH/(?<=area)(.+)(?=state)/${1:/pascalcase}/}

Задан путь к файлу, который выглядит как abc/123/area/my-folder/state/...

Ожидаемый:

/MyFolder/

Фактический:

abc/123/areaMyFolderstate/...

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Кажется, что ожидаемый вывод отличается от части строки во входных данных. При желании выражение может быть довольно сложным, например:

(?:[\s\S].*?)(?<=area\/)([^-])([^-]*)(-)([^\/])([^\/]*).*

и замена чего-то похожего на /\U$1\E$2$3\U$4\E$5/, если доступно.

Демо 1

Если будут другие операции, теперь я предполагаю, что, возможно, pascalcase что-то сделает, это простое выражение может просто сработать здесь:

.*area(\\/.*?\\/).*

и требуемые данные находятся в этой группе захвата $1:

(\\/.*?\\/)

Демо 2

0 голосов
/ 03 июля 2019

Опираясь на мой ответ, на который вы ссылались в своем вопросе, помните, что обходные пути - это «утверждения нулевой длины» и «не используют символы в строке».См. lookarounds - утверждения нулевой длины :

Lookahead и lookbehind, которые в совокупности называются lookaround, являются утверждениями нулевой длины, такими же, как начало и конец строки, а также start иякоря конца слова, объясненные ранее в этом уроке.Разница в том, что lookaround фактически совпадает с символами, но затем бросает совпадение, возвращая только результат: совпадение или отсутствие совпадения.Вот почему они называются «утверждениями».Они не потребляют символы в строке, а только утверждают, возможно ли совпадение.

Таким образом, в вашем преобразовании фрагмента: /(?<=area)(.+)(?=state)/ наглядные части фактически не используются и поэтому просто передаютсячерез.Vscode обрабатывает их, как и должно быть, как будто они вообще не находятся внутри сегмента «преобразуемая часть».

Именно поэтому обходные пути не исключаются из вашего преобразования.

0 голосов
/ 03 июля 2019

Вам необходимо сопоставить всю строку, чтобы достичь этого:

"${TM_FILEPATH/.*area(\\/.*?\\/)state.*/${1:/pascalcase}/}"

См. Демоверсию regex

Подробности

  • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше
  • area - слово - (\\/.*?\\/) - группа 1: /, любой 0+символы, отличные от символов разрыва строки, как можно меньше, и подстрока / - state.* - state и остальная часть строки.

NOTE :Если между area и state не должно быть других частей, замените .*? на [^\\/]* или даже [^\\/]+.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...