Pergunta

Deixe -me prefaciar isso dizendo que sou um amador completo quando se trata de Regex e só começou alguns dias atrás. Estou tentando resolver um problema formatando um arquivo e acertei um engate com um tipo específico de dados. O arquivo de entrada está estruturado assim:

Two words,Word,Word,Word,"Number, number"

O que eu preciso fazer é formatá -lo assim ...

"Two words","Word",Word","Word","Number, number"

Eu tive um padrão regex de

s/,/","/g

Trabalhando, exceto que também substitui a vírgula no número já cotado, seção número, que faz com que o campo separe e quebre o arquivo. Essencialmente, preciso modificar meu padrão para substituir uma vírgula por "" [citação de vírgula de citação], mas somente quando essa vírgula não é seguida por um espaço. Observe que os outros campos nunca terão um espaço após a vírgula, apenas a lista de números delimitados.

Consegui escrever

s/,[A-Za-z0-9]/","/g

que, ao mesmo tempo em que combinava as cordas apropriadas, substituiria a vírgula e a seguinte letra. Ouvi falar de referências e acho que pode ser o que eu preciso usar? Meu entendimento era que

s/(,)[A-Za-z0-9]\b

deve funcionar, mas isso não.

Alguém tem uma ideia?

Foi útil?

Solução

s/,([^ ])/","$1/ vai combinar um ","Seguido por um" não espaço ", capturando o espaço não-espaço e substituindo tudo pela parte capturada.

Dependendo de qual mecanismo regex que você está usando, você pode estar escrevendo \1 ou outras coisas em vez de $1.

Se você está usando Perl ou de outra forma, tenha acesso a um mecanismo regex com lookahead negativo, s/,(?! )/","/ (uma ","Não é seguido por um espaço) funciona.

Sua entrada se parece com o CSV, e se realmente é, você estaria melhor o analisando com um analisador CSV real, e não com regexes. Há muitos outros estojos de canto estranhos para se preocupar.

Outras dicas

Minha experiência foi que isso não é um ótimo uso de regexes. Como já foi dito, os arquivos CSV são melhor tratados por analistas reais do CSV. Você não marcou um idioma, por isso é difícil dizer, mas no Perl, eu uso o texto :: csv_xs ou dbd :: csv (permitindo que me SQL acesse um arquivo CSV como se fosse uma tabela, o que, é claro, usa o texto :: csv_xs sob as capas). Muito mais simples do que rolar o meu e muito mais robusto do que usar regexes.

Esta questão é semelhante a: Substitua os padrões que estão dentro dos delimitadores usando uma chamada de expressão regular.

Isso pode funcionar:

s/"([^"]*)"|([^",]+)/"$1$2"/g

Parece que você está usando sed.

Embora seu padrão pareça um pouco inconsistente, presumo que você gostaria que todos os itens separados por vírgulas tenham cotações em torno dele. Caso contrário, você está olhando para áreas de complexidade computacional expressões regulares não devem lidar.

Através do SED, seu comando seria:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

Observe que você ainda precisará colocar o DoubleQuotes no início e no final da string.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top