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

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

1-5,10-15 

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

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

它适用于像

  • 1-5,10
  • 1,5

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

尝试这种模式,

 ^\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 
  • 截图

在哪里处理逗号? 尝试在regexper中可视化你的正则表达式

现在尝试这个:

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

regexper.com截图

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

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

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

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

你好,那里,“你,人”给出

你好

那里

你,人

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

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

火柴:

1,5

1-5,5-10

15,2,10,4-10

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

 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]; } } } 

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

试试这个正则表达式:

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

您可能想要(\d+)-(\d+)来获得每个范围。 这里的例子。

我认为这应该也可以。

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

希望能帮助到你。