Regex匹配将斜角色(-44830298)
题
我试图获得颜色的信息,我已经存在的文本文件,然后使用那个颜色数字显示,为一个标签。但是,在运行时,当我按一下按钮这样做,它不会给我任何错误信息或任何东西。代码我有如下:
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:颜色