正则表达式,匹配不同数量的集合

时间:2011-10-15 19:40:55

标签: c# regex

我有一个程序想要捕获格式化的字符串输入。输入看起来像

{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
    }
}

哪个匹配正常,但是,我只能访问集合中的最后一个和倒数第二个数字。我希望能够从集合的每个成员中读取值。我该怎么做呢?除正则表达式之外的其他东西会更好吗?

3 个答案:

答案 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
     */

}