Регулярные выражения для выбора элементов RPP-файла Reaper, но исключения тех, которые определены с помощью ключевых слов

У меня есть это регулярное выражение(?!BYPASS \d \d \d\n.{6}<VST "VST: FreeG.*?WAK 0 0)(BYPASS \d \d \d.*?WAK \d \d)чтобы выбрать все элементы VST, кроме того, который начинается с ключевого слова, тогда у меня есть это выражение(BYPASS \d \d \d\n.{6}<VST "VST: FreeG.*?WAK 0 0)(?!BYPASS \d \d \d.*?WAK \d \d)сделать наоборот, когда он выбирает только элементы, которые имеютFreeGключевое слово. Вот как определяется элемент VST в файле RPP:

      <VST "VST: Saturation Knob (Softube)" "Saturation Knob.dll" 0 "" 1935766638<5653547361746E73617475726174696F> ""
        bnRhc+9e7f4CAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAAAAAAIAAAAAAAAAEAAAAAAAAAAAABAA
        776t3g3wrd5mZmY+AAAAPw==
        RGVmYXVsdABEZWZhdWx0ABAAAAA=
      >
      PRESETNAME Default
      FLOATPOS 0 0 0 0
      FXID {A9ED49E2-2CFE-4675-A539-CFA091920D52}
      WAK 0 0
      BYPASS 0 0 0

Интересно, есть ли лучший синтаксис для достижения аналогичного поведения с регулярным выражением, те, которые я разработал, кажутся немного запутанными. Вот весь файл RPP

      <REAPER_PROJECT 0.1 "6.66/win64" 1661967203
  <NOTES 0 2
  >
  RIPPLE 0
  GROUPOVERRIDE 0 0 0
  AUTOXFADE 1
  ENVATTACH 3
  POOLEDENVATTACH 0
  MIXERUIFLAGS 11 48
  PEAKGAIN 1
  FEEDBACK 0
  PANLAW 1
  PROJOFFS 0 0 0
  MAXPROJLEN 0 600
  GRID 3199 8 1 8 1 0 0 0
  TIMEMODE 1 5 -1 30 0 0 -1
  VIDEO_CONFIG 0 0 256
  PANMODE 3
  CURSOR 0
  ZOOM 41.11416036604871 0 0
  VZOOMEX 6 0
  USE_REC_CFG 0
  RECMODE 1
  SMPTESYNC 0 30 100 40 1000 300 0 0 1 0 0
  LOOP 0
  LOOPGRAN 0 4
  RECORD_PATH "" ""
  <RECORD_CFG
    ZXZhdxgAAA==
  >
  <APPLYFX_CFG
  >
  RENDER_FILE ""
  RENDER_PATTERN ""
  RENDER_FMT 0 2 0
  RENDER_1X 0
  RENDER_RANGE 1 0 0 18 1000
  RENDER_RESAMPLE 3 0 1
  RENDER_ADDTOPROJ 0
  RENDER_STEMS 0
  RENDER_DITHER 0
  TIMELOCKMODE 1
  TEMPOENVLOCKMODE 1
  ITEMMIX 1
  DEFPITCHMODE 589824 0
  TAKELANE 1
  SAMPLERATE 44100 0 0
  <RENDER_CFG
    ZXZhdxgAAA==
  >
  LOCK 1
  <METRONOME 6 2
    VOL 0.25 0.125
    FREQ 800 1600 1
    BEATLEN 4
    SAMPLES "" ""
    PATTERN 2863311530 2863311529
    MULT 1
  >
  GLOBAL_AUTO -1
  TEMPO 120 4 4
  PLAYRATE 1 0 0.25 4
  SELECTION 0 0
  SELECTION2 0 0
  MASTERAUTOMODE 0
  MASTERTRACKHEIGHT 0 0
  MASTERPEAKCOL 16576
  MASTERMUTESOLO 0
  MASTERTRACKVIEW 0 0.6667 0.5 0.5 -1 -1 -1 0 0 0 -1 -1 0
  MASTERHWOUT 0 0 1 0 0 0 0 -1
  MASTER_NCH 2 2
  MASTER_VOLUME 1 0 -1 -1 1
  MASTER_PANMODE 3
  MASTER_FX 1
  MASTER_SEL 0
  <MASTERPLAYSPEEDENV
    EGUID {07BFCFC9-6DA0-4D9C-8821-7D1555F3F3F8}
    ACT 0 -1
    VIS 0 1 1
    LANEHEIGHT 0 0
    ARM 0
    DEFSHAPE 0 -1 -1
  >
  <TEMPOENVEX
    EGUID {9059CD91-68BB-42A7-8E08-BCDDCB3AC50B}
    ACT 0 -1
    VIS 1 0 1
    LANEHEIGHT 0 0
    ARM 0
    DEFSHAPE 1 -1 -1
  >
  <PROJBAY
  >
  <TRACK {6186BBDC-D455-4398-90C0-668CF17125E9}
    NAME DAC
    PEAKCOL 16576
    BEAT -1
    AUTOMODE 0
    VOLPAN 1 0 -1 -1 1
    MUTESOLO 0 0 0
    IPHASE 0
    PLAYOFFS 0 1
    ISBUS 0 0
    BUSCOMP 0 0 0 0 0
    SHOWINMIX 1 0.6667 0.5 1 0.5 -1 -1 -1
    SEL 1
    REC 0 0 1 0 0 0 0 0
    VU 2
    TRACKHEIGHT 0 0 0 0 0 0
    INQ 0 0 0 0.5 100 0 0 100
    NCHAN 2
    FX 1
    TRACKID {6186BBDC-D455-4398-90C0-668CF17125E9}
    PERF 0
    MIDIOUT -1
    MAINSEND 1 0
    <FXCHAIN
      WNDRECT 500 247 511 642
      SHOW 0
      LASTSEL 1
      DOCKED 0
      BYPASS 0 0 0
      <VST "VST: Saturation Knob (Softube)" "Saturation Knob.dll" 0 "" 1935766638<5653547361746E73617475726174696F> ""
        bnRhc+9e7f4CAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAAAAAAIAAAAAAAAAEAAAAAAAAAAAABAA
        776t3g3wrd5mZmY+AAAAPw==
        RGVmYXVsdABEZWZhdWx0ABAAAAA=
      >
      PRESETNAME Default
      FLOATPOS 0 0 0 0
      FXID {A9ED49E2-2CFE-4675-A539-CFA091920D52}
      WAK 0 0
      BYPASS 0 0 0
      <VST "VST: FreeG (Sonalksis)" "Sonalksis FreeG Stereo (64 bit).dll" 0 "" 1181894483<56535446724753667265656700000000> ""
        U0dyRu5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAAAAAAIAAAAAAAAAPAAAAAEAAAAAABAA
        V0oxPgAAAD8AAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA
        AE5vbmUAEAAAAA==
      >
      PRESETNAME None
      FLOATPOS 0 0 0 0
      FXID {36381E0B-FD44-4B23-BA25-E9CC29920FFB}
      WAK 0 0
    >
    <ITEM
      POSITION 0
      SNAPOFFS 0
      LENGTH 14.22222222222222
      LOOP 1
      ALLTAKES 0
      FADEIN 1 0.01 0 1 0 0 0
      FADEOUT 1 0.01 0 1 0 0 0
      MUTE 0 0
      SEL 1
      IGUID {8FA4C4EF-ACED-4A1E-B4E0-AAAF41D8BCA4}
      IID 1
      NAME dac.wav
      VOLPAN 1 0 1 -1
      SOFFS 0
      PLAYRATE 1 1 0 -1 0 0.0025
      CHANMODE 0
      GUID {FD68F37C-6841-45B5-803E-83BB63FA6E98}
      <SOURCE WAVE
        FILE "dac.wav"
      >
    >
  >
>

1 ответ

Если формат файла всегда такой, вы можете написать шаблон только с одним отрицательным просмотром вперед, утверждая, что не после сопоставления<VST "VST: .

Вы также можете опуститьsфлаг, чтобы точка соответствовала новой строке.

Предполагая начальные пробелы, вы можете написать шаблон как:

      \bBYPASS(?: \d){3}\n *<VST "VST: (?!FreeG\b)[\s\S]*?\n *>(?:\n(?! *<).*)*\n *WAK \d \d\b

Объяснение

  • \bBYPASS(?: \d){3}\nСопоставьте слово BYPASS и 3 пробела и одну цифру, за которой следует новая строка
  • *<VST "VST:Соответствие буквально предшествует необязательным пробелам
  • (?!FreeG\b)Отрицательный взгляд вперед, не утверждатьFreeGНаправо
  • [\s\S]*?Совпадение с любым символом, включая новую строку, как можно меньше
  • \n *>Совпадение с новой строкой, необязательными пробелами и >
  • (?:Группа без захвата
    • \nСовпадение с новой строкой
    • (?! *<).*Совпадение со всей строкой Если она не начинается с<
  • )*Закройте группу без захвата и, при желании, повторите ее.
  • \n *WAK \d \d\bСоответствует новой строке, необязательным пробелам и WAK, за которыми следуют 2 одиночные цифры и пробел между ними.

Демонстрация регулярных выражений

Другие вопросы по тегам