0

テキスト ファイルに保存した色情報を取得し、その色をラベルの前色として使用しようとしています。しかし、実行時にボタンをクリックして実行しても、エラーメッセージなどは表示されません。私が持っているコードは以下です:

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);

私は他の情報インファイルにも他の正規表現を持っていますが、他の正規表現は問題ではありません。問題は、色 (argb) を一致させるために追加したばかりの正規表現です。それは文字列の最後にあります:

\r\n(\d+?)

したがって、私が理解している限り、上記の小さな正規表現は次のことを意味します。そうですか?

誰かがこれで私を助けてくれませんか。どうもありがとうございます。

注: テキスト ファイルに保存される色情報は、負の数 (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

したがって、正規表現は機能し、他のすべての詳細を正しく取得しますが、色情報を取得しません。

4

7 に答える 7

7

-と一致しません\d。また、貪欲でない一致を\d+行うと、正規表現を満たすため、最初の桁のみがキャプチャされます。正規表現をに変更して、番号の先頭に(-?\d+)あるオプション-と、番号に続く文字まで (ただし含まれていない) の桁数 (改行、文字列の終わりなど)に一致するようにします。 .

于 2009-11-05T14:33:19.117 に答える
6

この正規表現を試して、機能するかどうかを確認してください。

(。+?)\ r \ n ""([^ ""] +) "" \ r \ n(\ d +)、\ s(\ d +)\ r \ n([\ w \ s] *)\ r \ n(\d+。\d+)\ r \ n(-?\ d +)

正規表現は、フォントサイズ値の後に「」を探しているようです。

また、ARGBカラーは5ではなくグループマッチ7になります。

于 2009-11-05T14:38:46.467 に答える
1

あなたの正規表現は問題ではありません。あなたの正規表現と Wim によって与えられた正規表現は正常に機能します。したがって、問題は入力の処理方法にあるはずです。

あなたが試すことができるいくつかのことはここにあります:

この数値を使用する代わりに、別の入力でこれを実行します。

-16744193

代わりに次のようなものを使用してください。

100
-100

次に、この行の後に値を出力します。

int fcolor = Int32.Parse(match.Groups[7].Value);

そして、それが何であるかを見てください。

時間を節約するためにすべきもう 1 つのことは、

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 のすべての人だけでなく、問題が何であるかを簡単に確認できます。

于 2009-11-08T18:41:55.527 に答える
1

エラーのある行にブレークポイントを設定して、match.Groups[5].Value実際に何が起こっているかを確認します。

intに変換できないに違いない。

于 2009-10-03T00:03:15.727 に答える
1

他の場所で提案されているように一致値を出力すると、問題を特定しやすくするために正規表現を短くするだけでなく、役立ちます。

しかし、もう1つ提案できます。フォントサイズの一致から始まる正規表現の最後の部分は次のとおりです。

..."(\d+\.\d+)\r\n(-?\d+)"

と一致することになっている

...
14.0
-55794414

フォントサイズの数字の一致の直後に改行の一致があるため、14.0.0 以降はスペースがあると一致に失敗します。試してみてください

..."(\d+\.\d+)\s*\r\n(-?\d+)"

これは、末尾のスペースがあってもなくても機能するはずです。(正規表現エンジンによっては、"\s*"よりも優れている場合があります"\s*\r\n"。)

実際には、うまくいかない可能性のあることが他にもたくさんあります。一般に、文字列を分割して小さい正規表現で作業する方が簡単です。

私はあなたがすでに引用を知っていると思いますか?

問題に直面したときに、「分かった、正規表現を使用する」と考える人もいます。現在、彼らには 2 つの問題があります。

于 2009-11-10T10:00:56.647 に答える
0

次の正規表現を使用できます。

@"(.+)\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 つのラベルがあります。

正規表現のグループ:

  • 0 : コントロール
  • 1 : テキスト
  • 2 : ×
  • 3 : はい
  • 4 : フォント
  • 6 : サイズ
  • 7 : 色
于 2009-11-07T19:37:36.083 に答える
0

正規表現には 4 つのグループしかありませんが、空の文字列になるグループ 5 から 8 にアクセスしようとしています。空の文字列は Int32.Parse によって整数として解析できません。

于 2009-10-03T00:02:46.150 に答える