3

Powershell / Regex/EDIの新機能。これがEDIの正規表現で行われるべきではない理由についてのコメントはありません。警告を見ましたが、選択の余地はありません。

私が必要としているのはおそらく基本的なことですが、助けが必要です。セグメントのすべてのインスタンスを検索し、そこから特定の要素の値を取得する必要があります。検索されるテキストは、CR /LFなどのない1つの長い文字列として読み取られます。

データ例:

~SV1*HC:V2020*35*UN*1***1~DTP*472*D8*20120807~REF*6R*
~SV1*HC:V2100:LT*28.98*UN*1***1~DTP*472*D8*20120807~REF*6R*
~SV1*HC:92014*165*UN*1***1~DTP*472*D8*20120716~REF*6R*

別のセグメントで次のコマンドを使用しています。これは希望どおりに機能しますが、単語以外の文字も考慮する必要はありません。

Select-String -pattern '~svd\*\w+\*(\d+|\d+\.\d+)\*' -input $string -AllMatches | %{$_.Matches} | %{$_.Groups[1]} | %{$_.Value}

理想的には、「〜SV1 *」のインスタンスを見つけて、次のアスタリスクにスキップしてから、次のアスタリスクまですべてを読みたいと思います。そうすれば、そこにどんな文字/数字/文字が入っているかは関係ありません、それはそれをスキップします。上記のデータ例では、35、28.98、165の戻り値が必要です。そうでない場合は、自分が持っているもので作業できますが、単語と単語以外の文字の組み合わせを一致させると、そうではないため、スローされます。それらがどのような順序で存在するかを知っています。私が遊んだ他のすべては、弦の残りの部分を引っ張って、適切に停止しませんでした。

私がこれを行うことができれば、私はとても幸せです:

~SV1*<skip this>*<get this>*<skip to next SV1>~SV1*<skip this>*<get this>*<skip to next SV1>

最後に、プルされるデータはマネーフィールドであるため、小数点が存在する場合と存在しない場合があります。(\ d + | \d+。\d+)よりもクリーンな方法があれば、私はそれですべてです。

ありがとう

4

2 に答える 2

2

出発点ですが、テストする必要があります。

Select-String -pattern '(?<=~sv\d\*.*\*)(\d*\.?\d+)(?=\*un)' -input $string -AllMatches | %{$_.Matches} | % {$_.Groups[1]} | %{$_.Value}

サンプルデータを使用すると、35、28.98、165が返されます。

于 2012-11-02T16:42:00.800 に答える
1

次のようなパターンを使用します。

 ~sv\d\*[^*]*\*([^*]*)\*
于 2012-11-02T17:58:08.250 に答える