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