Можно ли улучшить это регулярное выражение, включающее отрицание и пре- и пост-исправления? - PullRequest
0 голосов
/ 19 октября 2018

Использование vim 7.4 (полная версия ниже) для проверки дампа xxd, такие строки:

00030cb0: 4845 5453 4948 4554 5349 4845 5453 4948  HETSIHETSIHETSIH
00030cc0: 4554 5349 4845 5453 4948 4554 5349 4845  ETSIHETSIHETSIHE
00030cd0: 5453 4948 4544 4d41 4554 4831 3030 3a20  TSIHEDMAETH100:
00030ce0: 5478 2062 7566 6665 7220 616c 6c6f 6361  Tx buffer alloca
00030cf0: 7465 642c 2061 6464 7220 3d20 3030 3046  ted, addr = 000F
00030d00: 4236 4639 0d0a 5453 4948 4554 5349 4845  B6F9..TSIHETSIHE
00030d10: 5453 4948 4554 5349 4845 5453 4948 4554  TSIHETSIHETSIHET
00030d20: 5349 4845 5453 4948 4554 5349 4845 5453  SIHETSIHETSIHETS

Я ищу строки, которые не соответствуют последовательности выходных данных IHETS, 0x30cd0 -0x30d00 включительно выше.У меня есть успешное регулярное выражение

\%(  \%(\%(\%(\%(\%(I\)\?H\)\?E\)\?T\)\?S\)\?\%(IHETS\)\+\%(I\%(H\%(E\%(T\%(S\)\?\)\?\)\?\)\?\)\?\)\@<!$

Объяснение:

  • \%( Совпадение в группе, но не создайте обратную ссылку;необходимо, потому что в противном случае в регулярном выражении слишком много обратных ссылок, и vim выдает ошибку.(Что является стимулом для того, чтобы задать этот вопрос.)
  • \@<! Соответствие (нулевая ширина), если предыдущий атом не совпадает
  • Тот факт, что длина одной группы IHETSвыходные данные отладки совпадают с 16 символами вывода ASCII, что означает, что мне нужно сопоставить частичные группы как до, так и после исправлений.

Можно ли повысить эффективность и / или человеческиетипизирование этого регулярного выражения?

Другая причина запроса - файл журнала огромен, а целевые строки редки, поэтому каждое нажатие n занимает довольно много времени.

То, что я пробовал, не сработало

Мне нужно сопоставить любую строку с хотя бы одним отклонением символа от группы IHETS где-нибудь в части ASCII.Таким образом, проверка только начального или конечного символа в блоке ASCII недостаточна.

Другие вещи, которые не будут работать

Я не могу просто удалить все несоответствующие строки и работатьоттуда, потому что дамп xxd встроен в больший файл журнала.

Текущее улучшение

Благодаря @melpomene:

\%(  \%(\%(\%(\%(\%(I\)\?H\)\?E\)\?T\)\?S\)\?\%(IHETS\)\+\%[IHETS]\)\@18<!$

К сожалению, замена \%( на \(, хотя теперь оно работает с учетом улучшения, намного медленнее (справка vim предупреждает об этом).

Версия Vim

:version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge version without GUI.  Features included (+) or not (-):
+acl             -clipboard       +dialog_con      +file_in_path    +job             +menu            -mouse_sysmouse  +persistent_undo +scrollbind      -tcl             +visual          -xim
+arabic          +cmdline_compl   +diff            +find_in_path    +jumplist        +mksession       +mouse_urxvt     +postscript      +signs           +terminfo        +visualextra     -xsmp
+autocmd         +cmdline_hist    +digraphs        +float           +keymap          +modify_fname    +mouse_xterm     +printer         +smartindent     +termresponse    +viminfo         -xterm_clipboard
-balloon_eval    +cmdline_info    -dnd             +folding         +langmap         +mouse           +multi_byte      +profile         +startuptime     +textobjects     +vreplace        -xterm_save
-browse          +comments        -ebcdic          -footer          +libcall         -mouseshape      +multi_lang      -python          +statusline      +timers          +wildignore      -xpm
++builtin_terms  +conceal         +emacs_tags      +fork()          +linebreak       +mouse_dec       -mzscheme        +python3         -sun_workshop    +title           +wildmenu
+byte_offset     +cryptv          +eval            +gettext         +lispindent      +mouse_gpm       +netbeans_intg   +quickfix        +syntax          -toolbar         +windows
+channel         +cscope          +ex_extra        -hangul_input    +listcmds        -mouse_jsbterm   +packages        +reltime         +tag_binary      +user_commands   +writebackup
+cindent         +cursorbind      +extra_search    +iconv           +localmap        +mouse_netterm   +path_extra      +rightleft       +tag_old_static  +vertsplit       -X11
-clientserver    +cursorshape     +farsi           +insert_expand   -lua             +mouse_sgr       -perl            -ruby            -tag_any_white   +virtualedit     -xfontset
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -Wdate-time  -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc   -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim        -lm -ltinfo -lnsl  -lselinux  -lacl -lattr -lgpm -ldl     -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm

1 Ответ

0 голосов
/ 19 октября 2018

Как насчет этого?

/\%(  \(.\)\@=\(IHETS\|HETSI\|ETSIH\|TSIHE\|SIHET\)\2\2\1\)\@18<!$

Средняя часть немного утомительна, но кажется, что она короче вашей попытки.

18 в \@18<! - это попыткапри оптимизации производительности.Он говорит vim, чтобы он смотрел в буфере не более 18 байт.

Тем не менее, если вас интересуют только строки, не соответствующие этому шаблону, это может быть проще сделать

:g/  \(.\)\@=\(IHETS\|HETSI\|ETSIH\|TSIHE\|SIHET\)\2\2\1$/d

заранее (т.е. удалите все строки, которые соответствуют шаблону).Предварительный просмотр не требуется.


Кроме того,

\%(I\%(H\%(E\%(T\%(S\)\?\)\?\)\?\)\?\)\?

можно было бы сократить до

\%[IHETS]

К сожалению, не существует аналогафункция для сопоставления суффиксов данной последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...