【问题标题】:Regex to select and replace stuff, keeping patterns正则表达式选择和替换东西,保持模式
【发布时间】:2017-03-28 20:42:31
【问题描述】:

我想更改一些字符串:

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

(put spaces around the `+`)

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

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

发现 regex 很好地匹配了所有内容,但显然,我的字符串被替换为字面意思
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
我也不能只使用­ \* 来匹配字符串,因为它会选择其他我不想替换的东西;我需要一些关于实际 ­ \* 的上下文来选择正确的字符串。同样,我不能使用像 ­ \*[^ ­ ] 这样的模式,因为星号后面的 not-space 字符会在替换后被删除。

我通过使用 Sublime Text 的多行版本解决了我的问题,但我仍然想知道:是否可以使用 regex 来替换包含“字符组”的字符串而无需擦除“字符组”的实际内容?

【问题讨论】:

标签: regex sublimetext2


【解决方案1】:

是的,这是可能的。您的替换不起作用的原因是(正如您已经注意到的)您的替换文本只是文字文本;您放入框中的任何内容都会替换您预期的匹配内容。

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

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

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

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

\1 + \2

如果需要,您可以多次使用每个数字:

\1 and again \1 and also \2

【讨论】:

  • 哇,我真的很惊讶它可能的......我以为我问的太多了。谢谢!
【解决方案2】:

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

Find: (\w+)\+(\w+)
Replace: $1 + $2

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

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

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

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多