我有一个程序想要捕获格式化的字符串输入。输入看起来像
{1, 2, 3, 4, 5, 6, 7}
只要数字全部在集合中,就可以存在不同数量的数字。例如:
{1, 2, 3}
{1, 2, 3, 4}
一切都有效。但是,我需要能够访问该集合中的每个数字。我有以下代码
Match match = Regex.Match(input, @"\{(\d,\s)*(\d)\}", RegexOptions.IgnoreCase);
if (match.Success)
{
String s;
for(int i = 0; i < match.Groups.Count; i++)
{
s = match.Groups[i].Value;
// Do actions here
}
}
哪个匹配正常,但是,我只能访问集合中的最后一个和倒数第二个数字。我希望能够从集合的每个成员中读取值。我该怎么做呢?除正则表达式之外的其他东西会更好吗?
答案 0 :(得分:2)
除正则表达式之外的其他内容会更好吗?
虽然正则表达式对于捕获括号括起的字符串最有帮助,但是在使用简单的命令式代码来获取数字之后会更容易。
我会从正则表达式\{([^\}]*)\}
开始,抓住以“{”开头并以“}”结尾的任何字符串的内部部分(中间没有'}')。然后,您可以使用逗号分割处理捕获以获取数字,然后在需要时修剪空白。
答案 1 :(得分:1)
您应该访问Captures
的{{1}}属性来访问所有捕获。
Group
此外,如果您不希望逗号分区成为捕获的一部分,并且您还希望仅允许一组数字,则可能需要将正则表达式更改为for (int i = 0; i < match.Groups.Count; i++)
{
CaptureCollection caps = match.Groups[i].Captures;
foreach (Capture cap in caps)
{
Console.WriteLine(cap.Value);
}
}
。< / p>
答案 2 :(得分:0)
试试这个:
var Input = "{1, 2, 3, 4, 5, 6, 7} foo {1, 2, 3} baa {1, 2, 3, 4} abc";
var Pattern = "\\{([0-9, ]+)\\}";
var Matches = Regex.Matches(Input, Pattern, RegexOptions.IgnorePatternWhitespace);
foreach (Match match in Matches)
{
string s = match.Groups[1].Value; // n1,n2,n3..
//do actions here
/*
* if you need parse each element,use s.Split(',').
* For example
* s is '1,2,3'
* string[] parts = s.Split(',');
* for(int x = 0,max = parts.Length; x < max; x++) {
* Console.WriteLine(parts[x]);
* }
*
* the output is something like:
* 1
* 2
* 3
*/
}