2

我有以下合法的字符串。

1-5,10-15

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

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

它适用于诸如

  • 1-5,10
  • 1,5

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

4

8 回答 8

6

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

现在试试这个:

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

来自 regexper.com 的屏幕截图

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

于 2013-07-12T12:32:43.450 回答
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
于 2013-07-12T12:43:09.620 回答
1

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

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

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

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

你好

那里

你,人

于 2013-07-12T12:29:32.033 回答
1
^(\s*\d+\s*-?\s*\d*)(\,(\s*\d+\s*-?\s*\d*))*$

它负责处理起始空格,后跟至少 1 位数字。“-”是可选的,后面可以跟一个或多个数字。"," 是可选的,后面可以跟以前一样的组。

火柴:

1,5

1-5,5-10

15,2,10,4-10

于 2013-07-12T13:03:55.997 回答
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];
        }
    }
}

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

于 2013-07-12T13:41:49.497 回答
1

试试这个正则表达式:

^\d+(-\d+)?(,\d+(-\d+)?)*$
于 2013-07-12T15:22:53.123 回答
0

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

于 2013-07-12T12:30:59.350 回答
0

我认为这也应该可以正常工作。

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

希望能帮助到你。

于 2013-07-12T12:37:05.010 回答