正则表达式 select 并替换内容,保持模式

Regex to select and replace stuff, keeping patterns

我想更改一些字符串:

space+cows       -->    space + cows
stupid+rabbit    -->    stupid + rabbit

(put spaces around the `+`)

在 Sublime Text 2 中,我尝试使用这些:

Find:    \w+\+\w+
Replace: \w+ \+ \w+

发现 正则表达式 匹配得很好,但很明显,我的字符串被字面意思替换了
w+ + w+

再举一个例子:

Strings:
bool *foo        -->    bool* foo
int *bar         -->    int* bar

Pattern:
Find:    (bool|int) *(foo|bar)
Replace: (bool|int)* (foo|bar)

Result:
(bool|int)* (foo|bar)
(bool|int)* (foo|bar)

不用说,我想保留实际的 boolintfoobar
我也不能只使用 ­ \* 来匹配字符串,因为它会 select 其他我不想替换的东西;我需要一些关于实际 ­ \* 到 select 正确字符串的上下文。同样,我不能使用像 ­ \*[^ ­ ] 这样的模式,因为星号后面的 not-space 字符在替换后会被删除。

我通过使用 Sublime Text 的多行版本解决了我的问题,但我仍然想知道:是否可以使用 regex 来替换包含 [= 的字符串42=] 而不擦除 "group of characters"?

的实际内容

是的,这是可能的。您的替换不起作用的原因是(正如您所注意到的)您的替换文本只是文字文本;无论您放入框中的是什么,都会替换匹配的内容,就像您希望的那样。

你需要做的是为此使用 RegEx capture。这样做的目的是使正则表达式处理器(在本例中为 Sublime Text)不仅匹配测试而且存储它以用于替换。为此,您可以将要保存的匹配部分括在括号中。每组括号是一个Capture Group.

对于您的示例,您的正则表达式变为

(\w+)\+(\w+)

每组括号内的匹配值被保存到它自己的数字组中,从 1 开始。像下面这样的语法扩展为第一个匹配项的内容,然后是带空格的加号,然后是第二个单词:

 + 

如果需要,您可以多次使用每个号码:

 and again  and also 

正则表达式转"stupid+rabbit" to "stupid + rabbit"

Find: (\w+)\+(\w+)
Replace:  + 

正则表达式转"bool *foo" or "int *bar" into "bool* foo" or "int* bar"

Find: (bool|int) \*(foo|bar)
Replace: * 

() - 形成稍后可以使用的组。 $1是第一组,$2是第二组。