1

基本的に、解析しているデータのストリームがあり、これはその典型的な形式です:

形式 1

07/11 04:05P 00:01:04 T204  *** P003 003                    P003           5019207185 7666

時々、データ形式が微調整され、次の形式になります。

形式 2

07/11 04:05P 00
:01:04 T204  *** P003 003                    P003                          5019207185 7666

フォーマット 1 で機能する同じ正規表現は、フォーマット 2 では機能しません。説明できる人はいますか? 私は正規表現に慣れていないので、本当にばかげているかもしれないことに注意してください。

これは私の正規表現です:

\s([\d/]+)\s([\d:AP]+)\s([\d:]+)\s([\dT]+)\s+([*]+)\s([PXTI\d]+)\s+([\d]+)?\s+([\da-zA-Z]+)\s+([\d]+)\s([\d]+)\s+$

言い忘れましたが、データ ストリームで*を探しています。

4

5 に答える 5

0

私のコメントを拡張するには、複数の形式に複数の正規表現を使用するのではなく、1 つの形式に 1 つの正規表現を使用することをお勧めします。可能であれば、受け取ったすべての文字列を同じ形式に正規化します。あなたの2つの例を考えると、間違いなくこれを行うことができます.

あなたは何を見つけていますか?\s*

何と交換していますか?(単一のスペース)。

次の例に従ってください:正規表現の検索と置換

string output = Regex.Replace(input, "\s*", " ");

次に、元の正規表現を で実行しますoutput

于 2013-07-30T20:47:33.307 に答える
0

この部分\s([\d:]+)\sを次のように交換する必要があります。\s(\d+\s*:\d+:\d+)\s

2 つの形式に一致するパターンの例:

(\d{2}/\d{2})\s(\d{2}:\d{2}[AP])\s(\d{2}\s*:\d{2}:\d{2})\s(T\d+)\s+(\*+)\s+([PXTI]\d+)\s+([\d]+)?\s+(?i)([a-z]\d+)\s+(\d+)\s(\d+)
于 2013-07-30T19:55:27.980 に答える
0

最初のものでも、どのように機能しているのかわかりません。2 番目の一致グループ([\d:AP]+)は "04:05P" (または任意の時間) に一致するように見えますが、\sで始まり、文字列が空白で始まらないため、最初の一致グループは時間に一致し、そこから下りです。また、文字列を空白で終了する必要がありますが、どちらの例もそうではありません。あなたが望むのは、最初と最後の空白をオプションにすることだと思います:

\s*([\d/]+)\s([\d:AP]+)\s([\d:]+)\s([\dT]+)\s+([*]+)\s([PXTI\d]+)\s+([\d]+)?\s+([\da-zA-Z]+)\s+([\d]+)\s([\d]+)\s*$

ところで、フォーマット 2 は 2 行に分割することを意図していますか? その場合、必要に応じて改行を一致させます。

\s*([\d/]+)\s([\d:AP]+)\s([\d]+\n?[\d:]+)\s([\dT]+)\s+([*]+)\s([PXTI\d]+)\s+([\d]+)?\s+([\da-zA-Z]+)\s+([\d]+)\s([\d]+)\s*$

これは、改行が常にまったく同じ場所にあると仮定しています。

于 2013-07-30T20:06:44.980 に答える