【问题标题】:VSCode Regex Find/Replace In Files: can't get a numbered capturing group followed by numbers to work outVSCode Regex 在文件中查找/替换:无法获得编号的捕获组,后跟数字来解决
【发布时间】:2020-11-01 03:09:28
【问题描述】:

我需要更换这个:

fixed variable 123

用这个:

fixed variable 234

在 VSCode 中,这匹配得很好:

fixed(.*)123

如果后面有数字,我找不到任何方法让它将捕获放在输出中:

fixed$1234 

fixed${1}234

但是查找替换窗口看起来像这样:

我读到 VSCode 使用了 rust 风格的 rexes。Here 表示 ${1}234 应该可以工作,但 VSCode 只是将它放在输出中。..

尝试以according to here 风格命名捕获

fixed(?P<n>.*)123     //"invalid regular expression" error

VSCode 好像看不懂${1}


ps;我很感激我可以在人为的例子中破解它

FIND: fixed (.*) 123
REPL: fixed $1 234

这在 vscode 中确实有效:

但并非我的所有数据在数字前始终具有相同的字符

【问题讨论】:

  • 我已经将其破解为两步替换,首先替换为xxx$1'234,然后替换'234234,但我仍然很想知道单步方法是什么跨度>
  • 好吧,你不是在做一个 find/replace ,你是在做一个跨文件的搜索/replace。该问题不会发生在查找/替换小部件中。由于您在数字之前确实有一个空格,因此将其包含在您的捕获组中,例如(.*?)( \d{1,}) 并替换为$1 234\d前面有个空格,见regex101.com/r/kBGDnc/3
  • 我会说这是搜索/替换功能中的错误。
  • @Mark 实际上,我发现即使是 $2 本身也会造成问题。当替换模式中有两个或多个连续的反向引用时,您的解决方法有效。 OP 可以使用fixed()(.*)123 并替换为fixed$1$2234,其中第一个捕获组匹配一个空白空间(这里是“技术”),第二个组捕获fixed123 之间的文本。
  • @Caius 抱歉我错过了but not all my data consistently has the same character before the number。将来我会放置更多/所有输入示例,它们会在您说出您需要匹配的内容时一起变化。然后有人可以一次性复制您的所有输入版本并轻松测试。

标签: regex visual-studio-code find-replace


【解决方案1】:

经过我自己和@Wiktor 的大量调查后,我们发现了针对 vscode 搜索(即跨文件查找)中这个明显错误的解决方法,并在替换将具有单个捕获组后跟数字的特定情况下替换功能,喜欢

$1234,其意图是替换为捕获组 1 $1,后跟 234 或任何数字。但$1234 是实际不需要的替换输出。

[这适用于当前文件的查找/替换小部件,但不适用于跨文件的查找/搜索。]

有(至少)两种解决方法。使用两个连续的组,如 $1$2234 和 $1$`234 一样正常工作(或在 $backtick 前面)。

因此,您可以像 (.*?)()(\d{3}) 那样创建一个假捕获组,其中捕获组 2 中没有任何内容,只是为了在替换中获得 2 个连续的捕获组或

使用您的初始搜索正则表达式 (.*?)(\d{3}),然后在您的“真实”捕获组 $1 之前或之后使用 $`。

OP 已提交问题https://github.com/microsoft/vscode/issues/102221


奇怪的是,我刚刚发现用$11 之类的单个数字替换效果很好,但只要添加两个或更多,它就会失败,所以$112 会失败。

【讨论】:

  • 这个问题刚刚以“这是个问题,去 StackOverflow 上问”结束。:|
  • 是的,我看到了,一个令人头疼的问题 - 在短时间内仍然需要 cmets。
【解决方案2】:

我想分享一些我在寻找解决方法时的更多见解和推理。

主要解决方法的想法是在替换中使用两个连续的反向引用

我尝试了Replacement Strings Reference: Matched Text and Backreferences 中描述的所有反向引用语法。似乎\g&lt;1&gt;\g{1}${1}$&lt;1&gt;$+{1} 等都不起作用。但是,还有一些其他的反向引用,例如$'插入匹配的子字符串之后的字符串部分)或$`插入匹配的字符串之前的部分子串)。但是,这两个反向引用在 VS Code 文件搜索和替换功能中不起作用,它们在替换模式中使用时不会插入任何文本。

因此,我们可以使用$`$' 作为替换模式中的空占位符

查找内容:     fix(.*?)123
替换为

  • fix$'$1234
  • fix$`$1234

或者,就像我在Mark's answer 中提供的preliminary test 一样,可以将匹配空字符串() 的“技术”捕获组引入模式中,以便可以使用对该组的反向引用作为后续“有意义的”反向引用之前的“守卫”:

查找内容fixed()(.*)123参见() 在可以使用$1引用的模式中
替换为fixed$1$2234

这里,$1 是一个“守卫”占位符,允许正确解析 $2 反向引用。

关于命名捕获组的附注

命名捕获组支持,但您应该使用 .NET/PCRE/Java 命名捕获组语法 (?&lt;name&gt;...)。不幸的是,没有一个已知的命名反向引用工作替换模式。我试过$+{name} Boost/Perl 语法,$&lt;name&gt;${name},没有用。

结论

所以,这里有几个问题需要解决:

  • 我们需要明确的编号支持语法\g&lt;1&gt;${1}$&lt;1&gt;
  • 我们需要确保$'$` 按预期工作或被解析为文字文本(与$_ 相同(用于在替换字符串中包含整个输入字符串)或$+(用于插入由实际参与匹配的最高编号捕获组匹配的文本)Visual Studio Code 文件搜索和替换功能无法识别的反向引用),当前行为当他们不插入任何文本时是相当不确定的
  • 我们需要引入命名反向引用语法(如\g&lt;name&gt;${name})。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多