使用 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
- 忽略已匹配到此点的运算符
_
- 我们的下划线。
据我所知,这实际上是一个非常简单的问题。我正在使用 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
- 忽略已匹配到此点的运算符_
- 我们的下划线。