重复捕获分隔字符串中的子字符串

Repeatedly capture a sub-string within a delimited string

假设我们有一个字符串:

some random text $$ hello world $$ some more stuff

在由 $$ 分隔的字符串中,我想捕获所有出现的 o(例如,为了在 Sublime Text 3 中查找和替换)。

如何制定这样的正则表达式命令?即使我计划在 Sublime Text 中使用这个正则表达式命令,我也可以使用一个使用不同符号的正则表达式命令并修复它以便在 ST3 中使用。

使用正则表达式:

($$[^o]*)o(.*?$$)

替换为:


其中 5 是替换字符串。

测试here.


如果你想搜索一个子字符串而不是一个字符,你可以使用:

($$.*?)lo(.*?$$)

使用相同的替换字符串。

测试here.


另一种选择是首先提取定界符 ($$ hello world $$) 之间的子字符串,然后在结果上执行您需要的任何搜索和替换操作。这可能还需要循环,直到不再进行任何替换。

就我对正则表达式的了解,您需要使用两个正则表达式来替换分隔符之间的 all o。第一个是实际抓取分隔符内的文本。例如:

(?P<start>$$)        # start by grabbing the starting literal '$$'
(?<middle>.*?)(?=$$) # then grab everything up until the ending '$$'
(?P<end>$$)          # now grab the ending '$$'

示例:https://regex101.com/r/015Xj8/4

显然您知道开始和结束是什么,因此您可以根据需要进一步简化它(例如,没有开始或结束组),但为了完整起见,我将其包括在内。

一旦你捕获了它的 start/end,你可以用文字 'o' 上的直接 find/replace 替换 o。据我所知,通过正则表达式需要两个步骤才能完成您想要的操作。我对 sublime 不太了解,但也许它有一个类似 sed 的替换功能。

以下将替换字符串中的第一个 o(类似于 virolino 的其他答案),但您需要多次单击 "Enter" 以确保所有最后的 o 被替换为有用的:

(?P<start>$$)
(?<middle>.*?(?<first_o>o).*?)(?=$$)
(?P<end>$$)

或者,如果您只是想捕捉 O(而不是其他),您可以确保它位于开始和结束之间 $$:

$$.*?(o).*?$$