【问题标题】:Can I exclude Positive Lookaheads and Lookbehinds within a snippet in vscode?我可以在 vscode 的代码段中排除积极的前瞻和后视吗?
【发布时间】:2019-07-03 15:28:15
【问题描述】:

我在排除 VSCode Snippet 中的部分字符串时遇到问题。本质上,我想要的是一条特定的路径,但我无法让正则表达式排除我需要排除的内容。

我最近问了一个类似的问题,您可以在这里找到:Is there a way to trim a TM_FILENAME beyond using TM_FILENAME_BASE?

如您所见,我主要被 sn-ps 在 vscode 中的工作方式所困扰,而不是正则表达式本身

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

给定一个看起来像 abc/123/area/my-folder/state/... 的文件路径

预期:

/MyFolder/

实际:

abc/123/areaMyFolderstate/...

【问题讨论】:

    标签: regex visual-studio-code vscode-snippets


    【解决方案1】:

    你需要匹配整个字符串来实现:

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

    regex demo

    详情

    • .* - 除换行符以外的任何 0+ 个字符,尽可能多
    • area - 一句话 -(\\/.*?\\/) - 第 1 组:/,除换行符之外的任何 0+ 字符,尽可能少,以及 / -state.* - state 子字符串和该行的其余部分。

    注意:如果areastate 之间必须没有其他子部分,请将.*? 替换为[^\\/]* 甚至[^\\/]+

    【讨论】:

      【解决方案2】:

      预期输出似乎与输入中的部分字符串不同。如果需要,表达式可能会非常复杂,例如:

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

      并替换类似于/\U$1\E$2$3\U$4\E$5/ 的内容(如果有)。

      Demo 1

      如果还有其他操作,现在我猜pascalcase 可能会做一些事情,这个简单的表达式可能在这里简单地工作:

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

      并且想要的数据在这个捕获组$1

      (\\/.*?\\/)
      

      Demo 2

      【讨论】:

        【解决方案3】:

        根据您在问题中链接到的我的答案,请记住环顾四周是“零长度断言”和“不使用字符串中的字符”。见lookarounds are zero-length assertions

        Lookahead 和lookbehind,统称为“lookaround”,是零长度断言,就像本教程前面解释的行的开始和结束,以及单词锚的开始和结束。不同之处在于环视实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不消耗字符串中的字符,而只是断言匹配是否可能。

        因此,在您的 sn-p 转换中:/(?&lt;=area)(.+)(?=state)/ 环视部分实际上并未被消耗,因此只是通过。 Vscode 将它们视为实际上根本不在“要转换的部分”段内。

        这就是为什么不会从您的转换中排除环视。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          • 2020-02-05
          • 1970-01-01
          • 2020-12-07
          • 1970-01-01
          相关资源
          最近更新 更多