1

Сценарий: я пытаюсь найти регулярное выражение в файле, который содержит похожие куски, это в основном файлы PGN.

Каждый кусок начинается с [события »

..и входит в

(1/2-1/2 | 1-0 | 0-1)

труба | Символ означает, что в скобках есть только одно значение: 1/2-1/2 или 1-0 или 0-1

Проблема: я хочу найти регулярное выражение, которое будет искать 1/2-1/2, а затем пойти вверх и найти «[Событие» и выбрать весь этот Чанк.

Итак, учитывая эти 3 куска

[Событие "Шахматы"] [Дата "2016"] [Белая "Каруана, F"] [Черный "Онищук, Ал"] [Результат "1-0"]

1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.OO Bc5 6.c3 b5 7.Bc2 d5 8.a4 dxe4 9.axb5 Bg4 10.bxc6 exf3 11.gxf3 Be6 12.Ra5 Qd6 13.f4 e4 14.d4 exd3 15.Qxd3 OO 16.Qxd6 Bxd6 17.Rd1 Bg4 18.Rd4 Bf3 19.Ba4 Rfe8 20.Be3 Ne4 21.Bd1 Bxd1 22.Rxd1 Rab8 23.Nd2 Rxb2 24.Nxe4 Rxe4 25.Re5 Rxe3 26.fxe3 Rb8 27.Ra5 Kf8 28.c4 1-0

[Событие "Шахматы"] [Дата "2016"] [Белый "Шабалов, А"] [Черный "Онищук, Ал"] [Результат "1/2-1/2"]

1.d4 Nf6 2.c4 e6 3.Nc3 d5 4.Nf3 Be7 5.e3 OO 6.Bd3 dxc4 7.Bxc4 c5 8.OO b6 9.Qe2 Bb7 10.dxc5 Bxc5 11.e4 Nbd7 12.Bf4 Nh5 13.Bg5 Be7 14.Be3 Nhf6 15.Rfd1 Qb8 16.Nd4 Rd8 17.f3 Ne5 18.Bb3 Nc6 19.Nxc6 Rxd1+ 20.Rxd1 Bxc6 21.Nb5 Qe5 22.Na3 Qc7 23.Rc1 Rc8 24.Qa6 Qd7 25.Rd1 Qc7 26.Rc1 Qd7 27.Rd1 Qc7 28.Rc1 Qd7 29.Rd1 Qc7 30.Rc1 1/2-1/2

[Событие "Шахматы"] [Дата "2016"] [Белый "Онищук, Ал"] [Черный "Акобян, V"] [Результат "1/2-1/2"]

1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 OO 6.Qc2 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Nxd5 exd5 10.Bxe7 Qxe7 11.Rc1 c5 12.dxc5 Bg4 13.e3 Bxf3 14.gxf3 Rc8 15.Qd2 Rxc5 16.Rxc5 Qxc5 17.Bg2 Nd7 18.ОО Rc8 19.Rd1 Nf6 20.f4 Qc2 21.Bxd5 Nxd5 22.Qxd5 Qxb2 23.Qd7 Rc1 24.Rxc1 Qxc1+ 25.Kg2 Qc4 26.Qxa7 Qe4+ 27.Кг3 Кг6+ 28.Kf3 Qh5+ 29.Кг2 Кг4+ 30.Kf1 Qd1+ 31.Кг2 1/2-1/2

Так что, если я введу это выражение, (хотя поиск начинается снизу, он должен только найти и выбрать третий фрагмент, как этот

[Событие "Шахматы"] [Дата "2016"] [Белый "Онищук, Ал"] [Черный "Акобян, V"] [Результат "1/2-1/2"]

1.d4 d5 2.c4 e6 3.Nc3 Nf6 4.Bg5 Be7 5.Nf3 OO 6.Qc2 h6 7.Bh4 b6 8.cxd5 Nxd5 9.Nxd5 exd5 10.Bxe7 Qxe7 11.Rc1 c5 12.dxc5 Bg4 13.e3 Bxf3 14.gxf3 Rc8 15.Qd2 Rxc5 16.Rxc5 Qxc5 17.Bg2 Nd7 18.ОО Rc8 19.Rd1 Nf6 20.f4 Qc2 21.Bxd5 Nxd5 22.Qxd5 Qxb2 23.Qd7 Rc1 24.Rxc1 Qxc1+ 25.Kg2 Qc4 26.Qxa7 Qe4+ 27.Кг3 Кг6+ 28.Kf3 Qh5+ 29.Кг2 Кг4+ 30.Kf1 Qd1+ 31.Кг2 1/2-1/2

... затем, когда я нажимаю найти далее, он должен найти 7 выберите 2-й кусок.

Таким образом, 2 слова для поиска равны 1. [Событие "2. 1/2-1/2

Пожалуйста, кто-нибудь может помочь ??

1 ответ1

1

Редактировать в соответствии с переформатировать

  • Ctrl+F
  • Найти что: \[Event (?:(?!\[Event)[\s\S])+1/2-1/2(?!"\])
  • проверить обернуть
  • проверьте регулярное выражение
  • НЕ ПРОВЕРИТЬ . matches newline
  • Поиск в документе

Объяснение:

\[Event     : literally [Event 
(?:         : start non capture group
  (?!       : start negative look ahead, zero-length assertion that make sure we don't have [Event after
    \[Event : literally [Event
  )         : end look ahead
  [\s\S]    : any character, space or not space
)+          : group appears 1 or more times
1/2-1/2     : literally 1/2-1/2
(?!"\])     : negative look ahead, zero-length assertion that make sure we don't have "] after

Это соответствует блоку 2 и блоку 3 в данном примере.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .