Поскольку вы упомянули кодировку 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.