Notepad++ 正则表达式搜索包含特定文本的文本块

Notepad++ 正则表达式搜索包含特定文本的文本块

我有 3 段这样的文字

[Event "Chess"]
[Date "1994"]
[White "Viktor Bologan"]
[Black "Michael Adams"]
[Result "0-1"]

1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 d6 6.Nbd2 a6 7.Bb3 Ba7 8.h3 O-O
9.Nf1 h6 10.g4 d5 11.Qe2 dxe4 12.dxe4 Nd7 13.g5 Nc5 14.gxh6 Nd3+ 15.Kd1 Nf4+
16.Qd2 Qf6 17.Rg1 g6 18.Kc2 Nxh3 19.Rg3 Nxf2 20.Ng5 Nxe4 21.Nxe4 Qxf1 22.Qg5 Qe2+
23.Kb1 Qxe4+  0-1


[Event "Chess"]
[Date "1995"]
[White "Michael Adams"]
[Black "Fernando Silva"]
[Result "0-1"]

1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 Bd7 7.Qd2 Nxd4 8.Qxd4 Qa5
9.Bd2 e5 10.Nd5 Qxd5 11.Qxd5 Nxd5 12.exd5 Be7 13.Be2 O-O 14.c4 Rfc8 15.O-O b5
16.Rfc1 bxc4 17.Bxc4 a5 18.Bd3 Bd8 19.Rxc8 Rxc8 20.Rc1 Rb8 21.b3 f5 22.Bc4 Kf8
23.h3 Ke8 24.Rc2 Bb5 25.Kf1 Bxc4+ 26.bxc4 Rb1+ 27.Ke2 Kd7 28.Bc3 Rg1 29.g3 Bb6
30.Be1 f4 31.gxf4 exf4 32.Bc3 g5 33.Kf3  0-1


[Event "Chess"]
[Date "1995"]
[White "Michael Adams"]
[Black "Jeroen Piket"]
[Result "1-0"]

1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 a6 6.Nbd2 O-O 7.Bb3 d6 8.h3 Be6
9.Bc2 h6 10.O-O Re8 11.Qe2 Nh5 12.Kh2 Nf4 13.Qd1 Qf6 14.Ng1 Rad8 15.Qf3 Qg6
16.Nb3 Nh5 17.Nxc5 dxc5 18.Be3 b6 19.Ne2 Nf6 20.Qg3 Qxg3+ 21.Nxg3 c4 22.Rfd1 cxd3
23.Bxd3 a5 24.Bc2 Rxd1 25.Bxd1 Rd8 26.Be2 Ne8 27.Nf1 Nd6 28.Nd2 f6 29.Kg1 Kf7
30.Kf1 Ke7 31.Ke1 Bf7 32.f3 Be6 33.Bf2 g6 34.b3 Kf7 35.Bd3 Nc8 36.Ke2 N8e7
37.h4 h5 38.Be3 Rd7 39.a3 Rd8 40.a4 Ra8 41.Nc4 Rd8 42.Rg1 Nc8 43.Rb1 Nd6
44.Nxd6+ Rxd6 45.Kd2 Ne7 46.Kc2 Bd7 47.Rg1 Be6 48.Be2 Rd8 49.Rf1 Nc8 50.f4 Nd6
51.Bd3 exf4 52.Bxf4 Ne8 53.Bb5 Nd6 54.Bc6 Kg7 55.e5 Bf5+ 56.Kb2 Nf7 57.exf6+ Kxf6
58.g3 Rc8 59.Re1 Rd8 60.Bxc7 Rc8 61.Bxb6  1-0

所以我试图找到并选择包含这些文本的整个块

1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 

所以如果我搜索它,它应该会同时选择 block1 和 block3。我正在尝试一种可能有帮助但无法完全构建它的模式。

模式是:\R\[Event (?:(?!\[Event)[\s\S])+1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 \s\S\R(?!"\])

答案1

\R您已经非常接近了,只需将开头的第一个更改为^(行首),转义点,并将最后一部分更改\s\S\R(?!"\])[\s\S]+?(?:\R\R|\z),请参阅下面的解释。

这将匹配您示例中的 2 个出现的情况。

  • Ctrl+F
  • 找什么:^\[Event (?:(?!\[Event)[\s\S])+1\.e4 e5 2\.Nf3 Nc6 3\.Bc4 Bc5 [\s\S]+?(?:\R\R|\z)
  • 检查环绕
  • 检查正则表达式
  • Find All in Current Document

解释:

^                                   # beginning of line
  \[Event                           # literally
  (?:                               # starqt tempered greedy token
    (?!\[Event)                     # negative lookahead, make sure we haven't [Event
    [\s\S]                          # any character included linebreak
  )+                                # 1 or more times
  1\.e4 e5 2\.Nf3 Nc6 3\.Bc4 Bc5    # literally
  [\s\S]+?                          # 1 or more any character included linebreak, not greedy
  (?:\R\R|\z)                       # non capture group, double linebreak or end of file

屏幕截图:

在此处输入图片描述

答案2

使用此搜索字符串:

^\[Event.*?\R.*?\R.*?\R.*?\R.*?\R.*?\R1\.e4 e5 2\.f4 exf4 3\.Nf3 g5 4\.h4 g4(?sm).*?(?=\R\R)

在哪里:

  • ^\[Event: 匹配[Event行首
  • .*?\R:非贪婪匹配任意字符,最多包含换行符,6 次
  • 1\.e4 e5 2\.f4 exf4 3\.Nf3 g5 4\.h4 g4:要搜索的字符串
  • (?sm):开启多行匹配
  • .*?:非贪婪匹配任意字符
  • (?=\R\R): 直到不包括空行

不要选中“.匹配换行符”选项。

在此处输入图片描述

相关内容