VScode - 用值替换捕获组

3
我有一堆代码中的字符串,例如: <td style="background-color:#fdfdff">&nbsp;</td><td>&nbsp;</td> 在一个文件中。
目标是将第一个示例中的&nbsp;替换为0,而将第二个示例中的&nbsp;替换为-(破折号)。
我正在使用VScode正则表达式,但我找不到用特定值替换捕获组的方法,因为$1、$2组指的是原始字符串组。 这只是一个示例,我尝试实现这个功能,但VScode不会忽略分组的正则表达式。

enter image description here


https://code.visualstudio.com/docs/getstarted/tips-and-tricks#_search-and-modify - Mosh Feu
抱歉,规则是什么?而且,由于不支持条件替换模式,您将不得不使用两个正则表达式,因此我们需要知道这两种模式之间的差异。是style属性吗? - Wiktor Stribiżew
谢谢您的回复。区别在于第一个是带有样式属性的 标签包围的td,而第二个没有(只有<td>标签)。 - Demetera
谢谢Wiktor。它起作用了(是的)。 问题是,我试图找到替换组的方法,但VScode正则表达式的工作方式有些不同。 - Demetera
您现在可以访问 https://learn.microsoft.com/en-us/visualstudio/ide/using-regular-expressions-in-visual-studio?view=vs-2022。 - anasqadrei
显示剩余2条评论
2个回答

3

另一种方法是使用一个可以进行条件替换的代码片段。使用以下代码片段:

    "replaceTDs": {
      "prefix": "tdr",    // whatever prefix you want 
      "body": [
        "${TM_SELECTED_TEXT/(?<=\">)(&nbsp;)|(&nbsp;)/${1:+0}${2:+-}/g}",
      ]
    }

条件替换很简单,因为您首先需要查找并选择您感兴趣的两个替代文本。 因此,
查找: <td\s*(style="[^"]*"\s*)>&nbsp;</td>|<td>&nbsp;</td>(旧版本)
这个更简单的查找可能适合您: <td\s*(style="[^"]*")?\s*>&nbsp;</td> 不要替换,而是按下Control+Shift+L:选择所有您的两个替代文本。Esc从查找小部件切换到编辑器。
然后应用您的代码片段,在这种情况下键入tdr+Tab
所有更改都已完成。 您只需制作一次代码片段,然后进行单个查找即可。

td replacement demo


这种技术比一次性运行多个查找/替换更具可扩展性。即使有更多的条件替换,只需简单修改一段代码即可添加更多的替换。

如果您使用按键绑定来触发代码片段(无需更改查找小部件的焦点或创建单独的代码片段),甚至可以进一步简化此过程。因此,没有代码片段,但有以下按键绑定:

 {
    "key": "alt+w",
    "command": "editor.action.insertSnippet",
    "args": {
      "snippet": "${TM_SELECTED_TEXT/(?<=\">)(&nbsp;)|(&nbsp;)/${1:+0}${2:+-}/g}"  
    },
    "when": "editorHasSelection"
  }

现在相同的演示:

td replacement keybinding


2
您可以使用以下方法:
  1. 搜索(?<=<td\s+style="[^"]*">)&nbsp;(?=</td>)并替换为0
  2. 搜索<td>&nbsp;</td>并将其替换为<td>-</td>,这里不需要正则表达式。
请注意,捕获组的作用是保留已捕获的子字符串。
第一个模式匹配:
  • (?<=<td\s+style="[^"]*">) - 一个字符串位置,紧接在它之前有<td,一个或多个空格,style=",任何零个或多个字符(除了"),然后是>
  • &nbsp; - 一个文本字符串
  • (?=</td>) - 紧挨着右边,必须是</td>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接