如何使用正则表达式替换将行填充到特定长度

时间:2019-07-03 11:25:05

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

想象一下这种情况

// ----------------------------------------------------------------------------
// firebase

// ----------------------------------------------------------------------------
// utils

例如可以使用此正则表达式/(^.{20}).*$/$1/将行修剪到特定长度,这将给出

// -----------------
// firebase

// -----------------
// utils
  

但是,如果我想填充其他行而不是集合   这样的长度一口气?有可能吗?

     
      
  • 一个正则表达式仅用于正确填充,而不用于修剪
  •   
// -----------------
// firebase --------

// -----------------
// utils -----------

很久以前,我正在做一些正则表达式忍者挑战,我们应该做数学运算,所以....正则表达式很神奇。


我最终想要实现的是一个VSCode代码段,该代码段使我可以编写:My Section --
然后触发一段代码,将插入的文本转换为包含80个字符的注释,其中包含

// My Section -----------------------------------------------------------------

https://code.visualstudio.com/docs/editor/userdefinedsnippets

2 个答案:

答案 0 :(得分:2)

我怀疑您可以一步执行所需的操作,而无需运行一些代码。但是您可以使用宏来执行此操作,因此可以一次触发多个步骤。在此示例中,我使用了宏扩展multi-command,但那里还有其他宏扩展。

在您的settings.json中:

"multiCommand.commands": [

 {
   "command": "multiCommand.pad--'s",
   "interval": 750,  // you don't need this, just for illustration

   "sequence": [              
     {
       "command": "type",  // add 80 -'s'
       "args": {
         "text": "--------------------------------------------------------------------------------"
       }
     },

     //select this wrapped line so the next snippet can use TM_SELECTED_TEXT
     "cursorHomeSelect",
     "cursorHomeSelect",

     {
       "command": "editor.action.insertSnippet",  // trim to first 80 characters
       "args": {
         "snippet": "${TM_SELECTED_TEXT/(.{80}).*/$1/g}",
       }
     }
   ]
 }
],

然后在keybindings.json中选择的任何键绑定

{
  "key": "ctrl+alt+-",
  "command": "multiCommand.pad--'s",
},

在下面的演示中,我将interval留在了上面,以便您可以查看步骤,但可以将其注释掉。另外,我将我的vscode设置为以80个字符换行。

基本思想是添加太多的连字符-80-,然后选择整个换行,并仅保留前80个字符,从而修剪尾随的连字符以填充该行中的80个字符。

demo of macro padding with hyphens

答案 1 :(得分:-1)

您可以使用replace的回调函数,并根据长度可以替换值

let str = `// ----------------------------------------------------------------------------
// firebase

// ----------------------------------------------------------------------------
// utils`

let final = str.replace(/^.*$/gm, (match)=>{
  return match.length === 0 ? match : match.length > 20 ? match.substr(0,20) : match + `-`.repeat(20-match.length)
})

console.log(final)

相关问题