使用 RegEx 在 Notepad++ 中发现的文本延伸得太远

使用 RegEx 在 Notepad++ 中发现的文本延伸得太远

假设以下文本

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/

答案4

您可以尝试以下操作:

  • 在查找内容框中输入:(^a=1$.*?x=)(\d+)
  • 在替换为框中:${1}0

图片:

相关内容