我有以下合法的字符串。
1-5,10-15
使用以下正则表达式,我得到一个错误的匹配。
^[^-\s]*-?[^-\s]*$
它适用于诸如
- 1-5,10
- 1,5
这些都是合法的。但它不会处理逗号分隔的范围。我错过了什么?
逗号的处理在哪里?尝试在regexper中可视化您的正则表达式
现在试试这个:
^(\d+-?\d+)(?:\,(\d+-?\d+))+$
更新:我的正则表达式不是解决方案,因为您可能对捕获有非常特殊的需求。然而,一旦你看到你的正则表达式做了什么,这个漂亮的工具可能会帮助你完成任务。
试试这个模式,
^\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
我所知道的用于拆分逗号分隔字符串的最佳正则表达式是:
",(?=(?:[^\""]*\""[^\""]*\"")*(?![^\""]*\""))"
它不会拆分包含逗号的引号中的条目。
例如,你好,那里,“你,人”给出
你好
那里
你,人
^(\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*)?$
希望能帮助到你。