4

約束します、しばらくの間、私の正規表現の質問の最後です。..本当。

私はどういうわけか、改行をすべきでないときに、いくつかの一致に改行を入れています。それは私が誤解しているものであると確信しています。または、取得しているデータは期待したものではありません。(これは可能です..!)

私は定義された正規表現を持っています: new Regex(@"^\s*[0-9]{4}[A-Z]{2}[\s\*]\s*(?<token>.*?)\-(?<value>.*?)$", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);

取得したドキュメント/文字列は、次のような時折の行でフォーマットされています。

0000AA Token1     - Value
0000AA Token2     - Value
0000AA Token3     - Value
0000AA Another Tok- Value

このようにすべてのトークンを順番に取得すると、上記の正規表現がうまく機能します。4 つの一致があります。

Match# <token> <value>
1      Token1      Value
2      Token2      Value
3      Token3      Value
4      Another Tok Value

これはいい。ただし、次のように、トークンの行が欠落しているファイルがユーザーから送信されることがあります。

0000AA Token1     - Value
0000AA Token2     - Value
0000AA Token3     - Value
0000AA
0000AA Another Tok- Value

これが発生すると、正規表現は次の値を提供します。

Match# <token>           <value>
1      Token1             Value
2      Token2             Value
3      Token3             Value
4      0000AA Another Tok Value

その理由はわかっています。上の行から始まる #4 のトークンと一致しています。ただし、「トークン」のグループ化を に変更しても、「トークン」(?<token>[^\n]*?)で同じ値が得られます。

明らかな何かが欠けているように感じます。すべきではないときに改行を一致させていました。私よりも多くの人々がそれをめぐって騒ぎました。着信文字列を確認しました-改行は ARE\nであり、 ではありません\r\nが、他に何か問題があるのではないかと考えています。

乾杯 - マイク。

4

1 に答える 1

4

問題は、先頭の英数字コードの後の\sにあります。\sは改行とも一致しますが、そうしたくありません。基本的に\s AND NOT \nに一致する必要があります。これは正規表現では表現できませんが、DeMorgan の定理を使用すると、この式を次のように書き換えることができます。

\s AND NOT \n = NOT(NOT \s OR \n)

NOT \sは\Sと書くことができます:

\s AND NOT \n = NOT(NOT \s OR \n) = NOT(\S OR \n)

これは、正規表現として簡単に表現できます。

\s AND NOT \n = NOT(NOT \s OR \n) = NOT(\S OR \n) = [^\S\n]

したがって、\s の代わりに[^\S\n]を使用します。これは、改行を除くすべてと \s の否定に一致することを意味します。

必要のないものもあると感じたので、同じエリアで他にもいくつか変更を加えました。と思われる場合は、元に戻すことができます。

Regex re = new Regex(@"^[0-9]{4}[A-Z]{2}[^\S\n]*(?<token>.*?)\-(?<value>.*?)$", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
于 2013-02-15T19:52:57.063 に答える