Регулярные выражения для выбора элементов 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 одиночные цифры и пробел между ними.