使用 Regex 替换后跟定界序列的单词

Replacing a word followed by a delimited sequence using Regex

据我所知,这实际上是一个非常简单的问题。我正在使用 Sublime Text,尽管这个问题适用于其他情况。

我有一个字符串序列,如下所示:

Test_Interface extends
Test_Interface_Foo_Bar {
Test_FooBar implements
Test_FooBarFoo_Bar_Bar_Foo

我想将它们替换为:

Test\Interface extends
Test\Interface\Foo\Bar {
Test\FooBar implements
Test\FooBarFoo\Bar\Bar\Foo

目前一直在摆弄反向引用,但是没有用

^Test((_[A-Za-z0-9]+)*)

基本规则是我需要它找到所有以 Test 开头的字符串,用反斜杠替换下划线,然后在 space.

处停止

您的正则表达式 - ^Test((_[A-Za-z0-9]+)*) - 仅在 line/string 的开头匹配 Test,然后捕获由 _ 组成的字符串,然后是字母数字符号 (1或更多,因为 +) 重复 0 次或更多次(参见 demo)。在大多数情况下,这意味着您只会得到 2 个组:Test 和它之后的第一个 _STRING。您至少需要将下划线移出捕获组,以便之后能够替换它。

我认为你需要一个基于 \K 的成功连续匹配的正则表达式来忽略匹配的开头:

(?:Test|(?!^)\G)[^_]*\K_

并替换为\

demo

如果Test必须是一个完整的单词,添加一个\b单词边界:

(?:\bTest|(?!^)\G)[^_]*\K_

详情:

  • (?:\bTest|(?!^)\G) - 起始边界是单词 Test 或上一个成功匹配的结尾
  • [^_]* - _
  • 以外的 0 个或更多字符
  • \K - 忽略已匹配到此点的运算符
  • _ - 我们的下划线。