【问题标题】:VSCode Search Replace RegExVSCode 搜索替换正则表达式
【发布时间】:2019-11-03 17:44:23
【问题描述】:

我正在拼合一个 Angular 翻译文件,我需要在 VScode 中对 translate 键进行搜索替换。我需要剪掉最后一个键之前的所有内容并将其返回给替换。密钥最多只有 3 层深。 key and keepThisInReplace 下面的字是任意的,会是不同的字。下面的例子。

搜索字符串选项:

'key1.keepThisInReplace1' | translate
'key1.key2.keepThisInReplace2' | translate
'key1.key2.key3.keepThisInReplace3' | translate
'anyWord.AndLevelAmount.UpTo3AtLeast.anyWordToKeep' | translate

在搜索中找不到:

'../../assets/images/
'./../assets/images/
'.......
'path').join
'staging.site
etc...

上面应该替换为:

'keepThisInReplace1' | translate
'keepThisInReplace2' | translate
'keepThisInReplace3' | translate
'anyWordToKeep' | translate

我正在尝试但不起作用 - 看起来像 '\w[^.].\w*.*\w*.将工作。几乎可以工作 - 在 'path').join 和 'staging.site 上继续。

上面所有的键前面都有{{。但是如果我锁定 {{ 那么我必须在替换中返回它。示例 = {{ key1.key2.keeptext | translate }} = {{ keeptext | translate }}

【问题讨论】:

    标签: javascript regex search replace visual-studio-code


    【解决方案1】:

    '.*\.' 应该是你所需要的。这将替换所有匹配一个刻度的字符串,后跟任意数量的字符,然后是一个点。

    如果你想更具体,你可以使用这个

    '\w*\.*\w*\.*\w*\.
    

    这将匹配最多 3 个点之间的单词。

    在此处查看演示:https://regexr.com/4g652

    编辑

    我试图让它更具体,这是我想出的:

    '.+\.(?=\w*'\s*\|\s*translate)
    

    这使用前瞻来确保匹配的字符串后跟一个单词,然后是' | translate。您认为这足够具体吗?

    演示:https://regexr.com/4g66i

    【讨论】:

    • 关于不需要返回值的好处。我看到的唯一问题是'..和'。也正在被退回。相对位置的示例 - '../../assets/images/ 和 './../assets/images/
    • 我猜 '.../ '......../ 也会 - 不是我看到这些发生,而是正则表达式搜索定义越多 = 越安全。
    • 看起来像 '\w[^\.]*\.*\w*\.*\w*\.几乎可以工作 - 在 'path').join 和 'staging.site 上继续。
    • 我编辑了我的答案,我认为这应该基本上保证只匹配您正在寻找的内容!如果没有,请告诉我
    【解决方案2】:

    您可以使用带有量词的非捕获组,该量词重复 1 到 3 次 1+ 个单词字符后跟一个点,并确保使用锚点 ^$ 启用多行。

    在替换中使用'

    ^'(?:\w+\.){1,3}(?=\w+'\s+\|\s+translate$)
    

    如果字符串可以在文件中的任何位置,您可以省略锚点并在翻译后使用单词边界\b

    '(?:\w+\.){1,3}(?=\w+'\s+\|\s+translate\b)
    

    说明

    • ^ 字符串开始
    • (?:\w+\.){1,3} 重复 1 - 3 次匹配 1+ 个单词字符和一个点
    • (?=正向前瞻,断言右边是
      • \w+'\s+ 匹配 1+ 个单词字符、' 和 1+ 个空白字符
      • \|匹配|
      • \s+translate$ 匹配 1+ 个空格字符,translate 并断言字符串结束
    • ) 关闭正向预测

    Regex demo

    另一个替代正向预测的选项是使用 2 个捕获组。

    在替换使用组1和组2$1$2

    ^(')(?:\w+\.){1,3}(\w+'\s+\|\s+translate$)
    

    Regex demo

    【讨论】:

    • 否,因为否则您必须使用 2 个捕获组来保留第二个单引号 ^(')(?:\w+\.){1,3}(\w+)(')\s*\|\s*translate$ 参见 regex101.com/r/O6xFpb/2
    • 我只是在问,因为您编辑了答案以在我完成后 30 秒添加它
    • 啊,我明白了。那不是故意的。我正在使模式更具体,然后对其进行更新。
    • 啊,好吧,好吧,我们最终得到了非常相似的答案,但你的答案更具体。虽然有了前瞻,但其余的似乎有点矫枉过正,这就是为什么我把它改回'.+\.
    • 顺便说一下,你可能想提一下,你的只有在启用多行时才有效,否则 ^$ 将不起作用