假设以下文本
a=1
b=2
x=1
---------
a=1
b=3
c=3
x=2
---------
a=2
b=5
x=3
... and so on, many blocks starting with a=, ending with x= and something in between
我想将所有 a=1 的块的 x 值替换为 0。为此,我搜索以下内容
^(a=1$.*?x=).*$
并将其替换为
\10
问题是,第一次出现已经从第一个 a=1 延伸到最后一个 x=3。它不会在第一次出现 x(即 x=1)时停止
我怎样才能让它仅选择从第一个 a 到与此 a 相符的 x(即,仅选择前 3 行,然后是下一个块的 4 行,依此类推)?
答案1
我几乎已经完成了……只是忘了把最后一个 .* 也设为懒惰的。因此,正确的搜索字符串是
^(a=1$.*?x=).*?$
答案2
- Ctrl+H
- 找什么:
^a=1$(?:(?!^a=).)+x=\K\d+
- 用。。。来代替:
0
- 查看 相符
- 查看 环绕
- 查看 正则表达式
- 查看
. matches newline
- Replace all
解释:
^ # beginning of line
a=1 # literally a=1
$ # end of line
# Tempered Greedy Token
(?: # non capture group
(?! # negative lookahead, make sure we haven't:
^a= # a line that begins with a=
) # end lookahead
. # any character
)+ # end group may appear 1 or more times
x= # literally x=
\K # forget all we have seen until this position
\d+ # 1 or more digitss
截图(之前):
截图(之后):
答案3
这应该可以满足您的要求:
插入“查找内容:”
(a=1[^x]*x=)([0-9])
插入“替换为:”\10
我已经使用给定的数据对此进行了测试,并使用以下在线工具构建了正则表达式查询 -https://regex101.com/