Usando o regex para extrair campos específicos do css, usando o notepad ++

0

Eu tenho uma folha de estilo css na qual eu quero realizar algumas análises e pareceu uma boa idéia usar o regex dentro do Notepad ++. Agora eu acho que não posso escrever o regex e talvez não tenha sido uma boa ideia, mas, má ideia ou não, eu quero saber como fazer isso.

Eu tenho um conjunto de estilos gerados automaticamente, rotulado (principalmente) block_1 a block_149. O que eu quero fazer primeiro é extrair apenas as informações sobre quais configurações de margem cada estilo especifica, já que essa parece ser uma das principais diferenças. Alguns são plausíveis, especialmente os primeiros para títulos etc., mas os posteriores parecem refletir os cálculos complexos do documento original do Word. Você pode ver as duas amostras abaixo:

[Nota: adicionei 2 espaços no final de cada linha para que eles sejam exibidos corretamente aqui - esses espaços não existem no código original. No entanto, o código original (importado do Sigil) tem espaçamento adicional no início de cada linha - não tenho certeza se isso será exibido como espaços ou como um caractere de tabulação - tenho tentado usar o indicador de espaço em branco para cobrir todas as opções.]

.block_8 {  
    background-color: #FFF;  
    display: block;  
    font-family: "Calibri", sans-serif;  
    font-size: 1.125em;  
    font-weight: bold;  
    line-height: 1.2;  
    page-break-after: avoid;  
    text-align: center;  
    padding: 0;  
    margin: 0 2.25pt 0 0  
    }  
.block_9 {  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    line-height: 1.2;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0  
    }  
.block_10 {  
    background-color: #FFF;  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    font-family: serif;  
    font-size: 0.75em;  
    line-height: 12.2pt;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0  
    }  
...   

.block_113 {  
    background-color: #FFF;  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    letter-spacing: -0.1pt;  
    line-height: 1.2;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0 0.3em 16.1pt  
    }  
.block_114 {  
    background-color: #FFF;  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    font-family: serif;  
    font-size: 0.75em;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0.5pt 0.3em 0.7pt  
    }  

Existem outras diferenças e até mesmo as posteriores, apenas para o corpo do texto, têm diferentes números de entradas.

O que eu gostaria de fazer é ter uma regex que eu possa usar em primeira instância para reduzir cada uma dessas entradas apenas para: Número do bloco) margin: (configurações)

Eu tinha pensado em extrair as diferentes configurações de margem (T, R, B, L), mas como a fonte pode incluir configurações 1,2,3 ou 4, separar essas regras por regex está além da minha ambição. Eu tenho usado o regex101.com para tentar estender a partir de um reconhecimento muito simples usando apenas as configurações de margem, mas conseguir incluir todas as linhas extras (número variável) entre o número do bloco e as configurações de margem me deixou perplexa. Idealmente, gostaria de poder usar uma técnica de regex semelhante para extrair outras configurações posteriormente. Eu também gostaria de poder lidar com números variáveis de espaços e / ou guias no layout.

Alguém pode me dizer como fazer isso? Chegou ao estágio em que quase certamente posso recortar e colar de maneira mais rápida, mas agora quero saber como fazer o regex no momento em que eu possa precisar dele para outro projeto.

EtA: Agora tenho código que fará o que eu pedi e agora quer mais! As configurações que eu queria eram as últimas do bloco - suponha que eu quisesse selecionar as configurações de altura de linha e isolá-las por um processo similar - como uma alternativa para as configurações de margem?

    
por deeplyblue 07.07.2016 / 12:43

1 resposta

0

Resposta

Vá para a caixa de diálogo " Substituir " do Notepad ++ (Ctrl + h) ou menu Search -> Replace... e selecione as seguintes opções:

  • Modo de pesquisa , selecione o botão de opção " Expressão regular ".
  • Modo de pesquisa , selecione ". corresponde à nova linha "

Use o seguinte para " Encontrar ":

(\.\w*)[[:blank:]]*\{.*?(margin:[\w[:blank:][:punct:]]*).*?\}

E para " Substituir por ", use algo assim (apenas os $ 1 e $ 2 são importantes):

$1 : $2

Explicação

Quebrando a string Find em seus componentes, da esquerda para a direita, temos:

  • (\.\w*) : Primeiro, precisamos encontrar o nome do bloco. Então, comece com literalmente um "." ( \. ), seguido por alguns caracteres alfanuméricos / sublinhados ( \w* ). Colocá-los entre parênteses torna-os no grupo a, neste caso, o primeiro grupo $1 .

  • [[:blank:]]*\{.*? : Após o nome do bloco, pode haver alguns espaços ( [[:blank:]]* ) seguidos de um colchete de abertura ( \{ - escapado com "\" porque os colchetes têm significado especial em regex) . Finalmente, combinamos QUALQUER COISA ( .* ), incluindo novas linhas, mas o mínimo possível (daí ? ), para colocar tudo dentro do bloco até a próxima parte (ou seja, "margem"). Note, nenhuma parte disso está agrupada, porque estamos efetivamente jogando fora.

  • (margin:[\w[:blank:][:punct:]]*) : A próxima parte de interesse é a "margem" e seu valor. Portanto, isso é agrupado e se tornará $2 . Primeiro, combinamos literalmente margin: , então seu valor, que será uma cadeia de alfanuméricos / sublinhados, pontuações e espaços (mas não novas linhas como caracteres). O motivo do complexo [\w[:blank:][:punct:]]* em oposição a algo como .*? é porque um . corresponderia a qualquer caractere, incluindo novas linhas e qualquer coisa depois da linha de margem que possa existir, até o colchete de fechamento.

  • .*?\} : Finalmente, combinamos tudo o que resta no bloco (neste caso, é apenas a nova linha no final da linha "margin") e a chave de fechamento. Mais uma vez, para ser descartado.

por 14.07.2016 / 03:55