Pergunta

Medicare elegibilidade EDI Exemplo Respostas é o que eu estou tentando corresponder.

Eu tenho uma string que se parece com isso:

LN:SMITHbbbbbbbbFN:SAMANTHAbbBD:19400515PD:1BN:123456PN:9876543210GP:ABCDEFGHIJKLMNOID:123456789012345bbbbbPC:123PH:8005551212CD:123456PB:123ED:20060101TD:2070101LC:NFI:12345678FE:20070101FT:20080101

Eu preciso de um conjunto de jogos que olhar como esta:

Key | Value
-------------------
LN  | SMITHbbbbbbbb
FN  | SAMANTHAbb
BD  | 19400515
... etc

Eu tenho lidado com isso o dia todo, e eu não consigo obter um cenário de correspondência aceitável. Estou prestes a programá-lo processualmente com um loop for e encontrar índices de dois pontos, se eu não posso pensar em alguma coisa.

Eu tentei usar negativo lookahead e eu não estou recebendo qualquer lugar. Esta é C #, e eu estou usando este testador ( .net), enquanto eu estou testando, juntamente com O Regex treinador (não .net).

Eu tentei usar o seguinte:

([\w]{2})\:(?![\w]{2}\:)

Mas isso só combina as chaves e seus dois pontos, como "LN:", "FN:"., Etc

Se eu usar:

([\w]{2})\:(.+?)([\w]{2})\:

Ele consome a próxima tecla do caractere de correspondência de dois e de cólon, bem como, levando somente a mim, combinando todas as outras par chave / valor.

Existe uma maneira para mim para combinar estes usando RegEx em .Net corretamente, ou estou preso com uma solução mais processual? Tenha em mente, eu não posso supor que as chaves serão sempre letras maiúsculas. Eles poderiam incluir números, mas eles serão sempre dois personagens e, em seguida, dois pontos.

Agradecemos antecipadamente por qualquer ajuda que puder conseguir.

Foi útil?

Solução

Eu acho que você quer é lookahead positivo, não negativo, de modo que você encontrar a combinação de teclas e vírgula à frente da posição atual, mas você não consumi-lo. Isto parece trabalhar para o seu exemplo de teste:

([\w]{2})\:(.+?)(?=[\w]{2}\:|$)

Rendimento:

LN: SMITHbbbbbbbb
FN: SAMANTHAbb
BD: 19400515
PD: 1
BN: 123456
PN: 9876543210
...

Nota:. Eu adicionei os dois pontos na minha saída de teste, eles não são capturados pelo regex

EDIT:. Obrigado, Douglas, Eu editei o regex para captura de fim-de-corda de modo a última entrada é capturado, também

Outras dicas

Isso funciona em JavaScript (eu sempre acender o erro Console no Firefox para brincar com expressões regulares), mas também deve funcionar bem em .NET:

([^:]{2}):((?:[^:](?!(?:[^:]:)))+)

Ele usa lookahead negativo:

( -> start capturing first token (the label)
    [^:]{2} -> two non-colon characters
) -> end capturing first token
: -> skip the colon
( -> start capturing the second token (the value)
    (?: -> don't capture this group as a token
        [^:](?! -> a non-colon character, not followed by:
                (?: -> don't capture this group
                    [^:]: -> a non-colon, followed by a colon
                ) -> end group
            ) -> end negative lookahead
    )+ -> one or more of this group
) -> end capturing the second token

Test:

"LN:SMITHbbbbbbbbFN:SAMANTHAbbBD:19400515"
    .replace(
        /([^:]{2}):((?:[^:](?!(?:[^:]:)))+)/g,
        "[$1] = [$2]\n")

Os rendimentos:

[LN] = [SMITHbbbbbbbb]
[FN] = [SAMANTHAbb]
[BD] = [19400515]

Olhando para o link de cada campo é de um comprimento fixo, então você poderia fazer algo parecido com isto:

int pos = 0;
Dictionary<string, string> parsedResults = new Dictionary<string, string>();

foreach (int length in new int[] { 13, 10, 8, 1, 6, 10, 15, 20, 3, 10, 6, 3, 8, 8, 1, 8, 8, 8, })
{
    string fieldId = message.Substring(pos, 2);
    string fieldValue = message.Substring(pos + 3, length);
    parsedResults.Add(fieldId, fieldValue);
    pos += length + 3;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top