notege ++ длина регулярного выражения в байтах

547
UpTide

Я изо всех сил пытаюсь придумать регулярное выражение в notepad ++, которое находит и заменяет x число байтов ничем. Счетчик возврата каретки (0D), счетчик перевода строки (0A).

Это регулярное выражение, которое я пытаюсь: (0C мое начало, я удаляю 318 байтов после 0C вместе с 0C)

\x0C(.) 

Это регулярное выражение ничего не находит, оно говорит, что совпадений не найдено. Я могу найти \x0C, и я могу найти, .но я не могу найти .также .пропускает более 0x0A и 0x0D

-обмотка проверена.

регулярное выражение проверяется.

Вот часть файла в шестнадцатеричном формате с ascii:

0C 30 31 32 27 34 35 36 0D 0A 30 61 32 0D 33 34 0A [snip] 0C 32 0A 0D 35 [etc..] <ff>0 1 2 ' 4 5 6<cr><lf>0 a 2<cr> 3 4<lf>[snip]<ff> 2<lf><cr>5 [etc..] 
1
Так в чем твоя проблема и что с ней не работает? Как выглядит ваш ввод и вывод? Seth 7 лет назад 0
одна вещь, которую вы можете попробовать, - это преобразовать файл в шестнадцатеричное и запустить регулярное выражение в шестнадцатеричном, так что файл будет немного похож на тот, который вы показываете, но тогда вы не делаете \ x0C, вы делаете буквально 0C. Ваш способ поиска гексагона, например, \ x0C, может также работать, если это ascii, так что каждый символ в любом случае является байтом. Но включите этот файл здесь, например, загрузите файл на http://ge.tt и включите ссылку в свой вопрос. Если вас интересует, соответствует ли точка новой строке, вы можете переключить ее https://superuser.com/questions/481276/how-to-make-regex-match-across-multiple-lines-in-notepad barlop 7 лет назад 1
Круглые скобки лишние, поэтому вы можете удалить их. Кроме того, попробуйте изменить 318 на гораздо меньшее число, например 3, посмотрите, соответствует ли оно чему-либо. Затем устраните неполадки, найдите, в какой момент они не совпадают. barlop 7 лет назад 0
@ barlop У меня не было этой опции для `.`, поэтому я обновился, и теперь все отлично работает ... Хотя сейчас я не знаю, что делать с моим вопросом. UpTide 7 лет назад 0
@ UpTide не имеет значения, вы могли бы просто оставить его. Хорошо, что вы нашли проблему и причину возникшей проблемы. barlop 7 лет назад 0
@UpTide: Вы * уверены *, что хотите считать * байты *, а не символьные кодовые точки? В зависимости от вашей кодировки, один символ может состоять из нескольких байтов. Также "." в регулярном выражении не соответствует переводу строки, поэтому следует ожидать, что он пропускает 0A и 0D. Wouter 7 лет назад 0
@ Да, да, это байты. Файл закодирован в us-ascii. Вы можете просмотреть информацию об этом в этом [PDF] (http://sliderule.mraiow.com/w/images/7/73/ASCII.pdf). UpTide 7 лет назад 0

1 ответ на вопрос

0
Wouter

Поскольку вы упомянули кодировку us-ascii, мы можем предположить, что каждый символ составляет один байт. В регулярном выражении "." соответствует любому символу, кроме новых строк, и вы хотите, чтобы каждая отдельная часть новой строки CR / LF сопоставлялась отдельно, так как они составляют два байта.

Я также собираюсь сделать предположение, что вы обрабатываете фактические текстовые данные, а не двоичный файл, который может содержать байты вне отображения символов us-ascii.

Если все вышеперечисленное верно, вы можете использовать следующее регулярное выражение:

\x0C[^\xFF] 

Причина "." не сработал в вашей попытке, потому что "." не соответствует переводу строки. Вы также не можете использовать \x0C[.\r\n], потому что "." Подстановочный знак недоступен в классе символов (группа в квадратных скобках). Значение Hex FF не отображается ни на одну действительную кодовую точку в наборе символов us-ascii, и, следовательно, когда вы ищите «любой символ, который не является символом FF», вы будете принимать во внимание байты .

Имейте в виду, что этот метод учитывает символы новой строки windows / mac как два символа / байта (по вашему запросу).

Надеюсь, это то, что вы искали ...

РЕДАКТИРОВАТЬ - объяснил Regex

Полное выражение

\x0C[^\xFF] 

Давайте разберемся с этим.

\ x0C

Это соответствует одиночной графической графике Unicode, вы можете найти более подробную информацию об этом здесь . Таким образом, вы можете рассматривать \ x версию точки в Юникоде, за исключением того, что она также может соответствовать переносам строк (это важно, подробнее об этом позже).

Но, так как вы также использовали это, я предполагаю, что вы уже частично знакомы с этим.

[^ \ XFF]

Все, что находится между [], называется набором символов (не путать с тем же понятием в кодировке символов). Вы можете прочитать больше об этом в Regexp Tutorial, но в целом, это служит оператором «ИЛИ». [ab] просто означает «а или б». Когда ^ используется внутри набора символов, это служит отрицанием. Так что [^ a] означает «не а». В нашем сценарии использования мы ищем любой символ, который не является значением HEX FF.

И мы ищем такого персонажа, 318 раз. Синтаксис {} всегда применяется к элементу Regex прямо перед ним, поэтому в этом случае набор символов [^ \ xFF].

Почему \ xFF?

В шестнадцатеричной записи набор символов us-ascii идет от 00 до 7E . Любое значение выше не может быть сопоставлено с кодовой точкой us-ascii. Это означает, что любой файл, закодированный (правильно) в us-ascii, может содержать только значения HEX между 00 и 7E. В результате, он не может содержать FF.

Таким образом, мы можем разумно использовать это для поиска любого символа, включая символы новой строки, поскольку \ x .. также соответствует символам новой строки, таким как \ x0A и \ x0C. Когда мы ищем любого персонажа, который не является FF, мы в конечном итоге находим каждого персонажа.

Имейте в виду, что это решение зависит от того, что ваш файл закодирован в us-ascii, а не в UTF-8.

в то время как ваше регулярное выражение работает отлично, я бы с удовольствием ознакомился с тем, что делает каждая его часть. По какой-то причине я не смог сосредоточиться на утверждениях регулярных выражений. UpTide 7 лет назад 0
поехали :) Wouter 7 лет назад 0
О, и это нормально, что вы не можете сосредоточиться на утверждениях регулярных выражений. http://regex.info/blog/2006-09-15/247 овладение регулярными выражениями занимает десятилетие :) Wouter 7 лет назад 0
Ваше объяснение превосходно. Если я правильно понял, то это находит x0C, выбирает его, затем выбирает следующие 318 байтов (даже если это x0C). Это выбирает 319 байтов, включая x0C. Спасибо! Я чувствую, что мне нужно сделать больше аккаунтов, чтобы поднять вас больше. UpTide 7 лет назад 0
Хаха, спасибо :) И да, ты правильно понял. Wouter 7 лет назад 0

Похожие вопросы