用于匹配ARGB颜色的正则表达式(-44830298)

时间:2009-10-02 23:54:21

标签: c# regex colors int argb

我正在尝试获取我存储在文本文件中的颜色信息,然后将该颜色用作标签的前景色。但是,在运行时,当我单击按钮来执行此操作时,它不会给我任何错误消息或任何东西。我的代码如下:

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

我还有其他信息inn文件的其他正则表达式,但其他正则表达式不是问题。问题是我刚刚添加的正则表达式尝试匹配颜色(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

因此,正则表达式工作,它正确获取所有其他细节,但它只是没有得到颜色信息。

7 个答案:

答案 0 :(得分:7)

-\d不匹配。此外,如果您在\d+上执行非贪婪匹配,则只会捕获第一个数字,因为它满足正则表达式。将正则表达式更改为(-?\d+)以匹配数字开头的可选-和数字中的数字,以及(但不包括)数字后面的字符(换行符,字符串结束,...)。

答案 1 :(得分:6)

试试这个正则表达式,看它是否有效。

(。+?)\ r \ n “个”([^ “”] +) “为” \ r \ n(\ d +),\ S(\ d +)\ r \ N(\ W \ S] 。*)\ r \ N(\ d + \ d +)\ r \ N( - ?\ d +)

你的正则表达式似乎正在寻找“在字体大小值之后。

此外,您的ARGB颜色将在组匹配7中,而不是5。

答案 2 :(得分:1)

我在错误的行上设置了一个断点,看看match.Groups[5].Value究竟是什么。

我打赌它无法转换为int。

答案 3 :(得分:1)

你的正则表达式问题。你的正则表达式以及Wim给出的正则表达式都可以。所以问题必须与处理输入的方式有关。

以下是您可以尝试的一些事项:

使用不同的输入运行它,即不使用此数字:

-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的每个人都能轻松查看问题所在。

答案 4 :(得分:1)

按照别处的建议打印出匹配值会有所帮助,同时缩短正则表达式可以更容易地解决问题。

但我可以再提出一件事。这是从字体大小匹配开始的正则表达式的最后一部分:

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

应与

匹配
...
14.0
-55794414

由于您在匹配字体大小数字后立即匹配换行符,如果您在14.0之后有空格,则匹配将失败。 试试

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

它应该在有和没有尾随空格的情况下工作。 (根据您的正则表达式引擎,"\s*"可能优于"\s*\r\n"。)

实际上还有很多其他事情可能会出错。通常更容易分割字符串并使用较小的正则表达式。

我想你已经知道这句话了吗?

  有些人在面对的时候   问题,想想“我知道,我会用   正则表达式。“现在他们有   两个问题。

答案 5 :(得分:0)

正则表达式中只有4个组,但是您尝试访问组5到8,这将是空字符串,并且Int32.Parse无法将空字符串解析为整数。

答案 6 :(得分: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 :X
  • 3 :Y
  • 4 :字体
  • 6 :尺寸
  • 7 :颜色