我有以下字符串是合法的。
1-5,10-15
使用以下正则表达式,我得到一个假的匹配。
^[^-\s]*-?[^-\s]*$
它适用于
之类的东西这些都是合法的。但它不会处理逗号分隔范围。我错过了什么?
答案 0 :(得分:6)
在哪里处理逗号?尝试在regexper
中可视化您的正则表达式现在试试这个:
^(\d+-?\d+)(?:\,(\d+-?\d+))+$
更新:我的正则表达式不是解决方案,因为您可能对捕获有非常特殊的需求。但是,一旦你看到正则表达式的作用,那个漂亮的工具可能会帮助你完成任务。
答案 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*)?$
希望它有所帮助。