2009-10-02 24 views
0

我试图获取我存储在文本文件中的颜色信息,然后使用该颜色作为标签的前景色。但是,在运行时,当我点击按钮来做到这一点,它不会给我任何错误信息或任何东西。我的代码如下:用于匹配ARGB颜色的正则表达式(-44830298)

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+?) 

所以据我了解,上述小正则表达式的事情是指这样的:“找一个回车符和换行符,然后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 

所以,正则表达式的工作,它正确地得到所有其他细节,但它只是没有得到彩色informati上。

+1

如果将match.Groups [5] .Value写入控制台,它会输出什么内容? – ChaosPandion 2009-10-03 00:01:45

+0

用您的输入样本更新您的问题,并向我们展示您期望匹配的内容。就像现在一样,你的正则表达式不支持你所指的组数。 – 2009-10-03 00:08:41

回答

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中的每个人都更容易了解问题所在。

+0

谢谢aditya – 2009-11-10 12:08:58

+0

没问题!很高兴我帮了忙。 – 2009-11-10 14:34:53

0

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

1

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

我敢打赌它不能转换为int。

+0

我已经尝试过双浮动字符串,我甚至尝试过咖啡,没有任何东西可以转换成任何东西: – 2009-10-03 00:10:43

7

-\d不匹配。此外,如果您在\d+上进行非贪婪匹配,则只会捕获第一位数字,因为它符合正则表达式。将您的正则表达式更改为(-?\d+)以匹配数字开头的可选-以及数字中的最大位数,最多(但不包括)数字后面的字符(换行符,字符串尾部.. )。

+0

谢谢@Wim。我已经更新了它,但是没有运气。我现在使用的正则表达式是: @ “(。+?)\ r \ n” 个 “([^” “] +)” 为“\ r \ n(\ d +),\ S(\ d +)\ r \ N(\ W \ S *) \ r \ n( - ?\ d +)“---和我必须将其转换为system.drawing.color的代码是: int fcolor = Int32 .Parse(match.Groups [7] .Value); int F_Color = Convert.ToInt32(fcolor); Color ControlForeColor = Color.FromArgb(fcolor); – 2009-11-05 14:46:39

+0

并且在最后一个\ r \ n之前有“”,试试这个: - >(。+)\ r \ n“”([^“”] +)“”\ r \ n(\ d +),\ s(\ d +)\ r \ n([\ w \ s)*)\ r \ n(\ d + \。\ d +)\ r \ n( - ?\ d +)< - 结果在第7组btw;) – Stormenet 2009-11-05 14:56:10

+0

感谢您的帮助ng @Stormenet,但它仍然不想工作:(任何想法? – 2009-11-05 15:05:26

6

试试这个正则表达式,看看它是否工作。 (。+?)\ r \ n“”([^“”] +)“”\ r \ n(\ d +),\ s(\ d +)\ r \ n([\ w \ s ] *)\ r \ n(\ d + \ d +)\ r \ n( - ?\ d +)

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

而且,你的。 ARGB颜色将在小组赛7中,而不是5。

+0

@baeltazor我已经在RegexBuddy中测试了这段代码,并且它按照预期与您的样本匹配。 – WDuffy 2009-11-05 15:13:02

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个标签使用不同的颜色,如被看到的正则表达式匹配的颜色。

正则表达式的基团:

  • :控制
  • :文本
  • :X
  • :Y
  • :字体
  • :大小
  • :颜色
1

打印出其他地方建议的匹配值将会是一种帮助,并且可以缩短正则表达式以便更容易区分问题。

但我可以建议一件事。这里的正则表达式从字体大小比赛开始的最后一部分:

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

这是应该来匹配

... 
14.0 
-55794414 

既然你有比赛的换行符匹配的字体大小后,立即数字,如果在14.0之后有空格,则匹配将失败。 试用

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

它应该工作,无论是否有尾随空格。 (根据您的正则表达式引擎,只需"\s*"可能会比"\s*\r\n"更好。)

实际上有一大堆其他东西可能会出错。分割字符串并使用较小的正则表达式通常更容易。

我想你已经知道报价了?

有些人,当与 面临的问题,认为“我知道,我将使用 正则表达式。”现在他们有 两个问题。

+0

谢谢你的详细解答。就个人而言,我从来不喜欢正则表达式。但是有几位S/O的人建议我使用它们。我正在尝试你的建议。谢谢:) – 2009-11-10 11:14:17

+0

我喜欢regexps,它们很方便,你可以用一行代替一页编程。当然,你也会得到一个页面的潜在错误:) 实际上,我已经放弃了正则表达式的大小,我花了太多的时间去调试它们。在你的情况下,我会先行分割,并且每个值有一个正则表达式;它变得更加易于处理。 祝你好运:) – 2009-11-10 11:49:52