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

C# 用于匹配ARGB颜色的正则表达式(-44830298),c#,regex,colors,int,argb,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 m

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

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);
我也有其他的正则表达式用于其他info inn文件,但其他正则表达式不是问题所在。问题是我刚刚添加的正则表达式,用于尝试匹配颜色argb。它位于字符串的末尾:

\r\n(\d+?)
据我所知,上面这个小小的正则表达式的意思是:找到一个回车和换行符,然后是一个或多个数字,但不要贪心。是这样吗

谁能帮帮我吗。多谢各位

注意:保存在文本文件中的颜色信息是负数ARGB color:

-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个组,但您正在尝试访问组5到8,这些组将是空字符串,并且Int32.Parse无法将空字符串解析为整数。

我会在出现错误的行上设置断点,并查看匹配的.groups[5]。值到底是什么


我打赌它不能转换为整数。

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

尝试此正则表达式,看看是否有效

.+?\r\n[^]+\r\n\d+,\s\d+\r\n[\w\s]*\r\n\d+。\d+\r\n-?\d+

您的正则表达式似乎在查找字体大小值之后的值


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

您可以使用此正则表达式:

@"(.+)\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);
在本例中,我们有两个不同颜色的标签,可以看出正则表达式与颜色匹配

正则表达式的组:

0:控制 1:文本 2:X 3:Y 4:字体 6:尺寸 7:颜色 你的正则表达式不是问题所在。你的正则表达式和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

把它们贴在这里。这将使您和每个at都能很容易地看到问题所在。

按照其他地方的建议打印出匹配值会有所帮助,同时缩短regexp以便更容易地隔离问题

但我可以再提一件事。以下是从字体大小匹配开始的regexp的最后一部分:

..."(\d+\.\d+)\r\n(-?\d+)"
应该是与之相匹配的

...
14.0
-55794414
因为在字体大小数字的匹配之后立即有换行符的匹配,所以如果在14.0之后有空格,则匹配将失败。 试一试

它应该既可以使用尾随空格,也可以不使用尾随空格。根据您的regexp引擎,just\s*可能优于\s*\r\n

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

我想你已经知道报价了吧

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


如果将match.Groups[5].Value写入控制台,它会输出什么?请使用输入中的示例更新您的问题,并向我们显示您希望匹配的内容。现在,您的正则表达式不支持您所指的组数。我尝试过双浮点数字符串,甚至尝试过咖啡,但没有任何东西可以转换为这行中的任何内容:谢谢@Wim。我已经更新了,但是运气不好。我现在拥有的正则表达式是:@.+?\r\n[^]+\r\n\d+,\s\d+\r\n[\w\s]*\r\n\d+\。\d+\r\n-?\d+-我必须将其转换为system.drawing.color的代码是:int fcolor=Int32.Parsematch.Groups[7]。Value;int F_Color=Convert.ToInt32fcolor;颜色控制Forecolor=Color.fromArgbColor;在上一次\r\n之前,请尝试以下内容:->.+\r\n[^]+\r\n\d+,\s\d+\r\n[\w\s]*\r\n\d+\.\d+.\r\n-?\d+感谢您帮助@Stormenet,但它仍然不起作用:有什么想法吗?@baeltazor我已经在RegexBuddy中测试了这段代码,它与您的示例和每个组的匹配情况如出一辙。谢谢您提供详细的答案。就我个人而言,我从来都不喜欢正则表达式。但S/O上的一些人建议我使用它们。我正在尝试你的建议。谢谢:我喜欢regexp,它们很方便,因为您 可以用一行代码替换一页编程。当然,你也会得到一页的潜在bug:实际上,我已经放弃了你的regexp大小,我花了太多时间调试它们。在您的情况下,我将首先在行上拆分,每个值有一个regexp;这样就更容易处理了。祝你好运:
..."(\d+\.\d+)\s*\r\n(-?\d+)"