正则表达式 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)
不用说,我想保留实际的 bool
、int
、foo
和 bar
。
我也不能只使用 \*
来匹配字符串,因为它会 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是第二组。
我想更改一些字符串:
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)
不用说,我想保留实际的 bool
、int
、foo
和 bar
。
我也不能只使用 \*
来匹配字符串,因为它会 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是第二组。