1

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

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

\x0C(.{318})

Это регулярное выражение ничего не находит, оно говорит, что совпадений не найдено. Я могу найти \x0C , и я могу найти . но я не могу найти .{318} также . пропускает более 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 ответ1

0

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

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

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

\x0C[^\xFF]{318}

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

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

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

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

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

\x0C[^\xFF]{318}

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

\x0C

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

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

[^\ XFF]

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

{318}

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

Почему \xFF?

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

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

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

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