【问题标题】:VS Code Snippets - Regex multiple operationsVS 代码片段 - 正则表达式多个操作
【发布时间】:2020-01-15 21:20:56
【问题描述】:

我已经尝试了一天让 sn-ps 与正则表达式一起工作,但我似乎无法找到一种方法。

用例是编写 LaTeX,特别是带有自动标签的部分。我有一些标签问题,因为 LaTeX 不允许在标签中使用某些丹麦语字符。因此,我希望 sn-p 处理替换本身以及其他一些格式。这意味着我想要以下内容:

  1. 将所有内容设为小写
  2. 将字母“æ”、“ø”和“å”更改为“ae”、“oe”和“aa”
  3. 删除特殊字符(因此字符只有 a-z 和 0-9)
  4. 将空格改为“_”

最后,我想突出显示“转换后的”文本,以便在需要时将其更改为不同的内容(以防重复标签)。

sn-p 如下所示:

\section{$1} \label{sec:${2:$1(after regex)}

希望这一切都有意义

转换将执行以下操作

Ørne og Mus! -> oerne_og_mus

这在 Textmate 中是可行的,使用以下 sn-p

\section{${1:section name}}
\label{sec:${2:${1/(\w+)(\W+$)?|\W+/${1:?${1:/asciify/downcase}:_}/g}}}

但这与 VS 代码不兼容。可以以某种方式将其更改为与 VS 代码一起使用吗?

【问题讨论】:

  • 如果你展示一个前后文本的例子会有所帮助。我不关注你的sn-p \section....
  • 是的,当然。因此,转换将执行以下操作:Ørne og Mus! -> oerne_og_mus

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


【解决方案1】:

好的,所以我最终可能找到了一个可以作为 sn-p 工作的解决方案

"\\section{$1}",
"\\label{sec:${2:${1/(æ)|(ø)|(å)|(é)|( +)|[^A-Za-z0-9]/${1:+ae}${2:+oe}${3:+aa}${4:+e}${5:+_}/g}}}",

我只发现了几个问题。

  1. 我必须手动将重音字母添加到列表中,例如 é
  2. 没有小写字母
  3. 如果有一个字符串说“!!”,它将被替换为两个下划线而不是 1,因为空格之间有一个中断。

有人知道如何改变吗?或者我什至可以在哪里找到这种类型的正则表达式的好资源(我一直找不到)

【讨论】:

  • 您在答案中看到我的编辑了吗?它解决了您的问题 1 和 2。
【解决方案2】:

编辑:试试这个 sn-p:

"latex labels": {
  "prefix": "_ll",
  "body": [
      "\\section{$1}",
      "\\label{sec:${2:${1/(\\w*)((æ)|(ø)|(å)|(é)|(\\s+)|([^a-zA-Z0-9_ ]))/${1:/downcase}${3:+ae}${4:+oe}${5:+aa}${6:+e}${7:+_}/gi}}}",
    ],
    "description": "Transform to latex labels"
},

如果您有更多丹麦语字符,则必须单独添加它们 - vscode 不支持 /asciify 转换。


上一个答案:

我真的不认为你可以在一个正则表达式中做到这一点。这意味着正常的 sn-p 将不起作用。不过,宏可以运行任意数量的 sn-p 转换。

使用宏扩展 multi-command 将其放入您的 settings.json:

  "multiCommand.commands": [

    {
      "command": "multiCommand.latexLabelTransform",
      "sequence": [
        "cursorHomeSelect",
        "editor.action.clipboardCopyAction",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "${TM_SELECTED_TEXT/(æ)|(ø)|(å)/${1:+ae}${2:+oe}${3:+aa}/gi}"
          }
        },
        "cursorHomeSelect",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "${TM_SELECTED_TEXT/(.*)/${1:/downcase}/}"
          }
        },
        "cursorHomeSelect",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "${TM_SELECTED_TEXT/[^a-z0-9 ]//g}"
          }
        },
        "cursorHomeSelect",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "\\section {$CLIPBOARD} \\label{sec:${2:${TM_SELECTED_TEXT/\\s/_/g}}}"
          }
        }
      ]
    }
  ]

还有一些键绑定:

{
  "key": "alt+d",
  "command": "extension.multiCommand.execute",
  "args": { "command": "multiCommand.latexLabelTransform" }
},

如果您从文本开始,例如Ørne og Mus!,请参见以下演示:


已选择转换后的部分,如演示中所示。在触发宏之前光标位于文本末尾。如果需要,我也可以从 \section {yourTextHere} 开始使用它。

我试图让它像普通的 sn-p 一样工作,但它似乎不是一种在单个转换中完成多个转换的方法。

让我知道这是否适合你。

【讨论】:

  • 嗨,马克真的很酷的解决方案。我明天去看看。我问这个问题的原因是因为我能够使用 sn-p 在 TextMate 中获得所描述的行为: \section{${1:section name}} % (fold) \label{sec:${2:${ 1/(\w+)(\W+$)?|\W+/${1:?${1:/asciify/downcase}:_}/g}}} ${0:$TM_SELECTED_TEXT} % 第 $2 节(结束) 这能够执行上面列出的命令,但是 sn-p 在 VS Code 中不起作用。正则表达式代码可以以某种方式更改以在 VS Code 中工作吗?
  • 试试我添加到答案顶部的 sn-p。它可能会奏效。
猜你喜欢
  • 2021-07-12
  • 2021-11-07
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多