0

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

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

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

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

4

7 回答 7

7

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

于 2009-11-05T14:33:19.117 回答
6

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

(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\ r\n(\d+.\d+)\r\n(-?\d+)

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

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

于 2009-11-05T14:38:46.467 回答
1

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

我打赌它不能转换为int。

于 2009-10-03T00:03:15.727 回答
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 的每个人都可以轻松地了解问题所在。

于 2009-11-08T18:41:55.527 回答
1

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

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

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

哪个应该匹配

...
14.0
-55794414

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

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

它应该在有和没有尾随空格的情况下都有效。(取决于您的正则表达式引擎,"\s*"可能比"\s*\r\n".)

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

我想你已经知道报价了吗?

有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

于 2009-11-10T10:00:56.647 回答
0

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

于 2009-10-03T00:02:46.150 回答
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:是
  • 4:字体
  • 6:尺寸
  • 7:颜色
于 2009-11-07T19:37:36.083 回答