【问题标题】:Looking for single regex that can "toggle" between two states寻找可以在两个状态之间“切换”的单个正则表达式
【发布时间】:2018-04-05 15:41:02
【问题描述】:

寻找一些创意。这适用于 javascript 风格的正则表达式。

当我说“切换”时,我指的是单个正则表达式和单个捕获引用替换字符串,它们可以执行以下操作:

'my-on-state'.replace(/MYSTERY/, '???')   // => 'my-off-state'
'my-off-state'.replace(/MYSTERY/, '???')   // => 'my-on-state'

给定一个 if 和两个正则表达式,这将是微不足道的;但是,只有 1 个正则表达式,我不确定如果没有某种方法来“捕获”源文本中实际上不存在的组,如何做到这一点——有没有办法做到这一点,也许使用前瞻捕获?

(对于那些想知道的人:这不是实际的 javascript 代码,它用于 VSCode 键绑定参数;您可以在变量引用中使用单个正则表达式和替换,所以我必须尽我所能塞进去单个正则表达式。)

【问题讨论】:

  • 不确定我是否理解您要完成的工作。您是在切换这两个值还是将on 更改为off,反之亦然?如果是这样,规则是什么?还有其他需要替换的词吗?当你说只有一个正则表达式替换时,你的意思是你想把你的两个正则表达式组合成一个吗?如果是这种情况,除非您使用回调函数,否则 javascript 的正则表达式是不可能的。
  • 嗯,在这个 sn-p 前后有一堆我关心的文本,但它并不有趣/不相关(即它有简单的解决方案)。也许您可以将我的问题归结为“是否有一个正则表达式和替换语句将字符串 'apple' 替换为 'banana' 和 'banana' 替换为 'apple'”。
  • 这有帮助吗? ConditionalReplace :rexegg.com/regex-trick-conditional-replacement.html 。您需要将其替换为 ('my-on-state' + 'onoff').replace(...) 然后
  • 大概是这样的:jsfiddle.net/z9854b5y
  • 感谢大家的建议,我认为我试图做的事情不能用一个正则表达式来完成(它绝对可以用两个来完成,或者用 match + if 语句等)。幸运的是,我找到了另一种解决问题的方法。

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


【解决方案1】:

“您可以将我的问题归结为“是否有一个正则表达式和 replace 语句将字符串 'apple' 替换为 'banana' 和 '香蕉' 与 '苹果'"

“它用于 VSCode 键绑定参数”

您没有详细解释,但听起来您需要有条件的替换 - 您可以在 vscode sn-ps 中执行这些操作:

{
  "key": "shift+alt+y",                        // whatever keybinding you like
  "command":  "editor.action.insertSnippet",
  "args": {
    "snippet": "${TM_SELECTED_TEXT/(apple)|(banana)/${1:+banana}${2:+apple}/g}"

        // if you would rather leave the snippet in a snippet file use this version 
        //  and the snippet that follows below
    // "name": "Apple <=> Banana"  

  },

  // "when": "editorTextFocus && editorHasSelection"
},

"Apple <=> Banana": {
 "prefix": "a-b",
  "body": [
    "${TM_SELECTED_TEXT/(apple)|(banana)/${1:+banana}${2:+apple}/g}"
  ],
  "description": "apples to bananas"
}

【讨论】:

  • 我认为我的方向更多的是关于文件切换(例如,如果编辑 /src/foo.js 则自动打开 /spec/foo-spec.js,反之亦然)。但是您使用的“何时”技巧同样适用(我想通过将resource 与资源匹配,然后在操作中使用$TM_FILENAME...如果我能弄清楚什么操作实际上会打开一个文件而不是文件选择器或对话窗口。)
  • 如何选择文本,然后键入一个 sn-p 前缀,并且仍然选择编辑器中的文本?
  • 你不能,因此键绑定。但是人们可能仍然更喜欢将 sn-p 放在 sn-p 中,然后通过键绑定引用 sn-p 名称 - 将所有 sn-ps 保存在一个 sn-p 文件中,而不是在整个键绑定中散布一些。我只是没有显示 sn-p 名称版本。我稍后会添加它。
猜你喜欢
  • 2020-08-02
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多