我正在尝试获取我存储在文本文件中的颜色信息,然后将该颜色用作标签的前景色。但是,在运行时,当我单击按钮来执行此操作时,它不会给我任何错误消息或任何东西。我的代码如下:
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
因此,正则表达式工作,它正确获取所有其他细节,但它只是没有得到颜色信息。
答案 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个不同颜色的标签,可以看出正则表达式匹配颜色。
正则表达式的组: