Como você mencionou que a codificação é us-ascii, podemos assumir que cada caractere é um byte. Na regex, o '.' corresponde a qualquer caractere, exceto newlines, e você deseja que cada parte individual de uma nova linha CR / LF seja correspondida separadamente, já que são dois bytes.
Também vou supor que você está processando dados de texto reais, e não um arquivo binário que possa conter bytes fora do mapeamento de caracteres us-ascii.
Se todas as opções acima forem verdadeiras, você pode usar o seguinte regex:
\x0C[^\xFF]{318}
A razão pela qual '.' não funcionou em sua tentativa, é porque o '.' não corresponde a novas linhas. Você também não pode usar \x0C[.\r\n]{318}
, porque o '.' O curinga não está disponível em uma classe de caracteres (grupo de colchetes). O valor hexadecimal FF não mapeia para nenhum codepoint válido dentro do conjunto de caracteres us-ascii e, portanto, quando você procura por "qualquer caractere que não seja o caractere FF", você levará bytes em consideração .
Tenha em mente que este método conta o windows / mac Newlines como dois caracteres / bytes (por sua solicitação).
Espero que seja o que você estava procurando ...
EDIT - Regex explicado
Expressão completa
\x0C[^\xFF]{318}
Vamos analisar isso.
\ x0C
Isto corresponde a um único grafo de Unicode, você pode encontrar mais informações sobre este aqui . Em resumo, você pode considerar \ xa versão Unicode do ponto, exceto que também pode corresponder a quebras de linha (isso é importante, mais sobre isso mais tarde).
Mas, como você também usou isso, imagino que já esteja parcialmente familiarizado com isso.
[^ \ xFF]
Tudo entre [] é chamado de Conjunto de caracteres (não deve ser confundido com o mesmo conceito em Codificação de caracteres ). Você pode ler mais sobre isso no Tutorial Regexp, mas em resumo, ele serve como uma instrução "OR". [ab] significa simplesmente "a ou b". Quando ^ é usado dentro de um conjunto de caracteres, serve como uma negação. Então [^ a] significa "não é um". Em nosso caso de uso, procuramos por qualquer caractere que não seja o valor HEX FF.
{318}
E procuramos esse tipo de personagem, 318 vezes. A sintaxe {} sempre se aplica ao elemento Regex na frente dele, então, neste caso, o conjunto de caracteres [^ \ xFF].
Por que \ xFF?
Na notação hexadecimal, o conjunto de caracteres us-ascii vai de 00 até 7E . Qualquer valor maior não pode ser mapeado para um ponto de código us-ascii. Isso significa que qualquer arquivo codificado (corretamente) em us-ascii, pode conter apenas valores HEX entre 00 e 7E. Como resultado, não pode conter FF.
Assim, podemos usar esse recurso para procurar qualquer caractere, incluindo caracteres de nova linha, desde \ x .. também corresponde a novas linhas como \ x0A e \ x0C. Quando procuramos por qualquer caracter que não seja não FF, acabamos por encontrar todos caracteres
.Tenha em mente que esta solução depende do fato de seu arquivo estar codificado em us-ascii e não em UTF-8.