正则表达式匹配逗号分隔的字符串

时间:2013-07-12 12:26:26

标签: c# regex

我有以下字符串是合法的。

1-5,10-15

使用以下正则表达式,我得到一个假的匹配。

^[^-\s]*-?[^-\s]*$

它适用于

之类的东西
  • 1-5,10
  • 1,5

这些都是合法的。但它不会处理逗号分隔范围。我错过了什么?

8 个答案:

答案 0 :(得分:6)

在哪里处理逗号?尝试在regexper

中可视化您的正则表达式

现在试试这个:

^(\d+-?\d+)(?:\,(\d+-?\d+))+$

screenshot from regexper.com

更新:我的正则表达式不是解决方案,因为您可能对捕获有非常特殊的需求。但是,一旦你看到正则表达式的作用,那个漂亮的工具可能会帮助你完成任务。

答案 1 :(得分:2)

尝试这种模式,

^\d+(\-\d+)?(\,(\d+(\-\d+)?))*$

它将匹配以下字符串:

1-5,10-15,5
1,2,3-5,3-4
1-5,10-15
10-15
10-15,5

但不是

1-,10-15,5
1,2,3-5,3-
1-510-15
10-15,
,10-15,5

答案 2 :(得分:1)

我知道用于拆分逗号分隔字符串的最佳正则表达式是:

",(?=(?:[^\""]*\""[^\""]*\"")*(?![^\""]*\""))"

它不会在包含逗号的引号中拆分条目。

E.g。你好,那里,“你,人民”给出了

您好

你,人

答案 3 :(得分:1)

^(\s*\d+\s*-?\s*\d*)(\,(\s*\d+\s*-?\s*\d*))*$

它负责起始空间,后跟至少1位数。 “ - ”是可选的,后面可以跟一个或多个数字。 “,”是可选的,可以跟随之前的同一组。

匹配

1,5

1-5,5-10

15,2,10,4-10

答案 4 :(得分:1)

这是一种仅使用拆分的方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RangeTester
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "1,2,3,1-5,10-15,100-200";
            string[] ranges = str.Split(',');
            foreach (string range in ranges)
            {
                Console.WriteLine(GetRange(range.Trim()));
            }
            Console.Read();
        }

        static string GetRange(string range)
        {
            string[] rng = range.Split('-');
            if (rng.Length == 2)
                return rng[0] + " to " + rng[1];
            else
                return rng[0];
        }
    }
}

我一直在想这个问题的解决方案,但是既然你知道你的数字/范围列表将首先用逗号分隔,然后用破折号分隔,你可以使用分割来解析各个部分。无需使用正则表达式来解析此字符串。

答案 5 :(得分:1)

试试这个正则表达式:

^\d+(-\d+)?(,\d+(-\d+)?)*$

答案 6 :(得分:0)

您可能需要(\d+)-(\d+)之类的内容来获取每个范围。示例here

答案 7 :(得分:0)

我认为这应该也可以。

^\d*(-\d*)?,\d*(-?\d*)?$

希望它有所帮助。