2

Medicare Eligibility EDI Example Responsesは、私が一致させようとしているものです。

次のような文字列があります。

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

次のような一致のセットが必要です。

キー | キー | 価値
-------------------
LN | スミスbbbbbbbb
FN | サマンサbb
BD | 19400515
...など

私は一日中これに対処してきましたが、許容できるマッチング シナリオが得られないようです。forループを使用して手続き的にプログラムし、何かわからない場合はコロンのインデックスを見つけようとしています。

否定先読みを使用してみましたが、どこにも行きません。これは C# であり、テスト中にこのテスター(.Net) を使用しています。また、Regex Coach (非 .Net) も使用しています。

私はこれを使ってみました:

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

ただし、それは「LN:」、「FN:」などのキーとそのコロンのみに一致します。

私が使用する場合:

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

次の一致する 2 文字のキーとコロンも消費するため、他のすべてのキーと値のペアのみが一致します。

.Net で RegEx を使用してこれらを正しく一致させる方法はありますか? キーが常に大文字であるとは限りません。数字を含めることもできますが、常に 2 文字の後にコロンが続きます。

私が得ることができる助けを前もって感謝します。

4

3 に答える 3

8

あなたが望むのは、負ではなく正の先読みだと思うので、現在の位置より先にキーとコロンの組み合わせを見つけますが、それを消費しません。これは、テスト例でうまくいくようです:

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

収量:

LN: スミスbbbbbbbb
FN: サマンサbb
BD: 19400515
PD: 1
BN: 123456
番号: 9876543210
...

注: テスト出力にコロンを追加しましたが、正規表現ではキャプチャされません。

編集: ありがとう、ダグラス、最後のエントリもキャプチャされるように、正規表現を編集して文字列の終わりをキャプチャしました。

于 2008-12-16T17:31:20.470 に答える
0

リンクを見ると、各フィールドは固定長なので、次のようにすることができます。

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;
}
于 2008-12-16T21:09:57.970 に答える
0

これは JavaScript で動作します (私は常に Firefox でエラー コンソールを起動して正規表現をいじります)、.NET でも問題なく動作するはずです:

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

否定先読みを使用します。

( -> 最初のトークン (ラベル) のキャプチャを開始します
    [^:]{2} -> コロン以外の 2 文字
) -> 最初のトークンのキャプチャを終了
: -> コロンをスキップ
( -> 2 番目のトークン (値) のキャプチャを開始します
    (?: -> このグループをトークンとしてキャプチャしない
        [^:](?! -> コロン以外の文字。
                (?: -> このグループをキャプチャしない
                    [^:]: -> コロン以外の後にコロンが続く
                ) -> 終了グループ
            ) -> 否定先読みを終了
    )+ -> このグループの 1 つ以上
) -> 2 番目のトークンのキャプチャを終了します

テスト:

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

収量:

[LN] = [スミスbbbbbbbb]
[FN] = [SAMANTHAbb]
[BD] = [19400515]
于 2008-12-16T17:35:57.980 に答える