我试图获得颜色的信息,我已经存在的文本文件,然后使用那个颜色数字显示,为一个标签。但是,在运行时,当我按一下按钮这样做,它不会给我任何错误信息或任何东西。代码我有如下:

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

我还有其他regex的其他信息酒店的文件太多,但其他regex不是问题。问题是regex,我刚刚加入到试着匹配颜色(将斜角).它在结束的string:

\r\n(\d+?)

这样尽我所知,上述小regex事情,意味着这个:"找到一个carriagereturn和行,然后1个或多个数字,但不能贪婪".是这样吗?

有人可以请帮助我这个。非常感谢你。

注:颜色的信息被保存在案文的文件是一个负数(将斜角色):

-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

因此,regex的作品,它获得的所有其他细节正确的,但这只是不得颜色的信息。

有帮助吗?

解决方案

您正则表达式是的的问题。您正则表达式以及由维姆给出的正常工作。所以,问题必须是与输入被处理的方式。

下面有一些事情你可以尝试:

用不同的输入运行此,即不是使用此数:

-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,看看是什么问题。

其他提示

-不受\d匹配。另外,如果你在\d+做一个非贪婪的比赛只有第一个数字将被捕获,因为满足正则表达式。改变你的正则表达式到(-?\d+)在你的电话号码,并尽可能多的数字的开始,因为在数量最多(但不包括)下列数(换行字符,结束串匹配可选-,.. )。

试试这个正则表达式,看看它是否工作。

(。+?)\ r \ n “个”([^ “”] +) “为” \ r \ n(\ d +),\ S(\ d +)\ r \ N(\ W \ S] 。*)\ r \ N(\ d + \ d +)\ r \ N( - ?\ d +)

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

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

我要设置与错误的行断点,看看match.Groups[5].Value真的是。

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

打印出来的匹配值如别处建议将是一个帮助,以及缩短了正则表达式,使其更容易分离的问题。

不过,我可以建议一两件事。这里的正则表达式的从字体大小匹配开始的最后部分:

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

这是应该来匹配

...
14.0
-55794414

由于你有匹配的匹配的字体大小的数字后立即换行,如果14.0后有一个空间,匹配将失败。 与尝试

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

应具有和不具有尾随空格工作。 (根据您的正则表达式引擎,只是"\s*"可能比"\s*\r\n"更好。)

其实有其他的事情可能出错了一大堆。这是通常更容易分裂的字符串和较小的正则表达式的工作。

我想你已经知道了报价?

  

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

您只有4正则表达式组,但您试图访问组5至8,这将是空字符串,和一个空字符串不能解析为通过Int32.Parse一个整数。

你可以使用这regex:

@"(.+)\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片公司的财产与不同的颜色,可以看出regex匹配颜色。

该组regex:

  • 0:控制
  • 1:文本
  • 2:X
  • 3:Y
  • 4:字体
  • 6:尺寸
  • 7:颜色
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top