正規表現のマッチングARGB色(-44830298)
質問
監督-選手コメンを使用して色を取得します情報につい保存をテキストファイルを使用する色としてのforecolorのためのラベル。でも、実行時に私のボタンをクリックしいものだが、いずエラーメッセージなどはなかったです。をコードしています。
MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)""\r\n(\d+?)");
foreach (Match match in lines)
int color = Int32.Parse(match.Groups[5].Value);
私はその他の正規表現のためのその他の情報インファイルのものその他のregexジョンの問題です。問題は、regexるだけで追加されてみて、色(argb).この末尾に文字列:
\r\n(\d+?)
っているみたいで、少しregexことを意味す:"見carriagereturn、改行し、1桁以上の数字だきる欲張り".そんなことがあったのですか。
できる人になりたいです。ありがとうございます。
注意:色情報を保存し、テキストファイルに負数(ARGBカラー):
-16744193
ファイルの内容は以下のようになっています:
Control
Control Text
Control Location
Control Font Name
Control Font Size
Control Font Color
説明:
Label
"this is a label"
23, 77
Tahoma
14.0
-55794414
なので、regexの作品でその他の詳細が正しくだ作品の色情報です。
解決
あなたの正規表現は の問題ではありません。あなたの正規表現だけでなく、ヴィムによって与えられた1が正常に動作します。だから、問題は、入力が処理されている方法である必要があります。
ここであなたが試すことができますいくつかのものがあります:
異なる入力でこれを実行し、すなわち、代わりにこの番号を使用しての
-16744193
の代わりにこのようなものを使用します:
100
-100
次に、この行の後に値をプリントアウトします:
int fcolor = Int32.Parse(match.Groups[7].Value);
そして、それが何であるかを見ます。
あなたがすべきもう一つの時間を節約する事が、
内の値をプリントアウトされますmatch.Groups[1].Value
match.Groups[2].Value
match.Groups[3].Value
match.Groups[4].Value
match.Groups[5].Value
match.Groups[6].Value
match.Groups[7].Value
match.Groups[8].Value
そして、ここでそれらを投稿してください。これにより、簡単にあなただけでなく、SOですべての問題があるかを確認するために行います。
他のヒント
-
は\d
にマッチしていません。あなたは\d+
上の非欲張りマッチを行う場合には、正規表現を満たすため、また、唯一の最初の桁がキャプチャされます。 、数であるとして、あなたの数やなど、多くの数字の開始時に、オプションの(-?\d+)
に一致するように-
にあなたの正規表現を変更して、最大(は含まない)数(改行、終了の文字列の次の文字。.. 。)。
この正規表現を試してみて、それが動作するかどうかを確認します。
(。+?)\ R \ n "は"([^ ""] +) "" \ R \ N(\ D +)、\ S(\ D +)\ R \ N([\ sはwは\] 。*)\ R \ N(\ D + \ D +)\ R \ N( - ?\ D +)
あなたの正規表現は、「フォントサイズの値の後を探しているように見えます。
また、あなたのARGBカラーはグループのマッチ7、ない5になります。
私は、エラーのある行にブレークポイントを設定し、実際に何であるかmatch.Groups[5].Value
参照してくださいね。
私はそれがint型に変換することはできません賭けている。
他の場所で示唆したように、一致値をプリントアウトすると、ヘルプだけでなく、それが簡単に問題を特定できるようにする正規表現の短縮になります。
しかし、私はもう一つのことを提案することができます。ここではフォントサイズの試合から始まる正規表現の最後の部分があります:
..."(\d+\.\d+)\r\n(-?\d+)"
タグにマッチすると想定されます
...
14.0
-55794414
あなたはすぐにフォントサイズの数字に一致した後の改行に一致するものを持っているので、あなたが14.0の後にスペースがある場合、マッチは失敗します。 試してみてください。
..."(\d+\.\d+)\s*\r\n(-?\d+)"
とし、末尾のスペースなしで両方動作するはずです。 (あなたの正規表現エンジンによっては、ちょうど"\s*"
が"\s*\r\n"
よりも良いかもしれません。)
間違って行くことができる他のものの全体の束が実際にあります。文字列を分割し、より小さな正規表現で動作するように、一般的に簡単です。
私はあなたが既に見積もりを知っていると仮定?
一部の人々は、ときに直面します 問題は、私が知っている、私が使用します」だと思います 正規表現。」今、彼らが持っています 二つの問題ます。
あなたは、正規表現で唯一の4つのグループを持っているが、あなたは空の文字列になり、アクセスグループ5〜8しようとしている、と空の文字列がでInt32.Parseによる整数として解析することはできません。
利用することができregex:
@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)"
使用例からです:
string value = @"Label
""this is a label""
23, 77
Tahoma
14.0
-55794414
Label
""this is a label""
23, 77
Tahoma
14.0
-55794415";
MatchCollection lines = Regex.Matches(
value,
@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)");
var colors = new List<int>();
foreach (Match match in lines)
{
colors.Add(Int32.Parse(match.Groups[7].Value));
}
CollectionAssert.AreEquivalent(new[] { -55794414, -55794415}, colors);
この例では2つのラベルの異なる色として見られるの正規表現に一致す。
グループのregex:
- 0:制御
- 1:テキスト
- 2:X
- 3:Y
- 4:フォント
- 6:サイズ
- 7:色