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