Estou tentando usar a expressão regular para pesquisar e substituir várias vezes na mesma linha. Acredito que o Regex pode fazer isso usando o recurso lookahead/lookbehind positivo.
Tenho uma longa lista de estados e aeroportos neles. E estou tentando colocá-los todos em
State, Aiport
pares, uma linha de cada vez.
Aqui está a entrada
State, Airports
----------------
Chicago, ORD, MDW
NY, JFK, LGA, EWR
California, LAX, JWA, LGB, BUR
Aqui está a saída.
Chicago, ORD
Chicago, MDW
NY, JFK
NY, LGA
NY, EWR
California, LAX
California, JWA
California, LGB
California, BUR
Você pode ajudar a sugerir um regex ou qualquer outra maneira de fazer isso? Obrigado.
Eu uso o Notepad++ para o Regex, mas posso usar qualquer editor de texto para isso.
Esse regex é muito complicado. Ao usar uma linguagem de programação real, as coisas serão muito mais simples.
Aqui eu dou um exemplo em Python. Obtenha o Python aqui .
Digamos que você tenha esta entrada:
E você deseja convertê-lo em sua saída fornecida:
É simples, primeiro divida a string em linhas, depois divida cada linha em
list
ingsstr
por vírgulas. Por fim, retorne a combinação do primeiro elemento e todos os outros elementos do mesmolist
.^(\w+,\h*)(\w+)(?:,\h*(\w+))?(?:,\h*(\w+))?(?:,\h*(\w+))?(?:,\h*(\w+))?(?:,\h*(\w+))?(?:,\h*(\w+))?(?:,\h*(\w+))?(?:,\h*(\w+))?(?:,\h*(\w+))?
$1$2\n(?3$1$3)(?4\n$1$4)(?5\n$1$5)(?6\n$1$6)(?7\n$1$7)(?8\n$1$8)(?9\n$1$9)
. matches newline
Explicação:
Substituição:
Captura de tela (antes):
Captura de tela (depois):
Para o Notepad++, se você precisar usá-lo, também pode usar o PythonScript :
Plugins
->Plugins Admin...
-> MarquePythonScript
e clique emInstall
.Plugins
->PythonScript
->New Script
-> crie-o noscripts
diretório padrão.Isso funciona com o cabeçalho e o preserva.
Eu sei que você pediu um regex para usar no Notepad ++, mas aqui está um perl one-liner de qualquer maneira:
Explicação:
perl
: invocar perl-n
sinalizador: executará um loop em cada linha da entrada e executará o código fornecido para cada linha-l
sinalizador: remove automaticamente os finais de linha na entrada e os adiciona às saídas-e
sinalizador: use o código fornecido como argumento($state,@f) = split /,\s*/
: divida a linha em qualquer lugar onde houver uma vírgula, separada por espaço em branco opcional, coloque o primeiro valor em $state e o restante em array@f
print "$state, $_" for @f
: para cada item em@f
(portanto, cada aeroporto), imprima uma linha com o estado e o aeroportoAlternativa:
-F',\s*'
sinalizador: divisão automática usando o regex separador fornecido, armazene os resultados em@F
. Implica-n
.$state = shift @F
: remova o primeiro item de@F
e armazene-o em$state
Claro que Chicago não é um estado :-)