regex 在分隔字符串内重复捕获子字符串

h9a6wy2h  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(120)

假设我们有一个字符串:
some random text $$ hello world $$ some more stuff
在由$$分隔的字符串中,我想捕获所有出现o的地方(例如,为了在Sublime Text 3中查找和替换)。
我如何制定这样一个正则表达式命令?尽管我计划在Sublime Text中使用这个正则表达式命令,但我可以使用一个使用不同符号的正则表达式命令,并将其修复以在ST3中使用。

oxcyiej7

oxcyiej71#

使用正则表达式:

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

替换为:

\15\2

其中5是替换字符串。
测试here
如果你想搜索一个子字符串而不是一个字符,你可以使用:

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

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

g0czyy6m

g0czyy6m2#

根据我的正则表达式知识,你需要用两个正则表达式来替换分隔符之间的所有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
显然,您知道开始和结束是什么,因此如果需要,可以进一步简化它(例如,没有开始或结束组),但为了彻底起见,我已经包含了这些内容。
一旦你捕获了它的开始/结束,你就可以直接在文字'o'上查找/替换o。据我所知,通过正则表达式需要两个步骤来完成你想要的。我不太了解sublime,但也许它有一个类似sed的替换功能。
下面的代码将替换字符串中的第一个o(类似于virolino的另一个答案),但是你需要多次单击“Enter”以确保最后的所有o都被替换,这样才有用:

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

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

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

相关问题