我不太明白正则表达式是如何组合在一起的,所以这是我的问题。
我有一个分隔字符串1,3;5,1;6,4
,依此类推。基本上,我在这里所拥有的是存储带有产品ID和数量的购物车。1
,3
这意味着我有一个带有 id"1"
和数量的产品3
。产品(带卷)用 分隔";"
。
我需要做的是将验证此类字符串的正则表达式放在一起。只允许正数,例如从 1 到 10000。
有没有人有解决方案?
我认为你最好不要为此使用正则表达式。假设您的格式是这样的1,3;5,1;6,4
(即不是您在问题中指定的其他@Rich 指出的那样),您应该能够将其拆分;
然后,
:
var input = "1,3;5,1;6,4";
var pairs = input.Split(';') // ["1,3","5,1","6,4"]
.Select(x => x.Split(',')) // [["1","3"],["5","1"],["6","4"]]
.Select(x => new { Id = x[0], Volume = x[1] }); // [{ Id : "1", Volume : "3"} ...]
foreach(var pair in pairs)
{
Console.WriteLine("Id: " + pair.Id + " Volume: " + pair.Volume);
}
// Id: 1 Volume: 3
// Id: 5 Volume: 1
// Id: 6 Volume: 4
注意:我在System.Linq
这里使用了 and 一个匿名类型,但如果你愿意,你可以不用。
IndexOutOfRangeException
另请注意:如果您的输入不是预期的格式,这将失败(即抛出一个)。如果您想验证一些不可靠的输入,那么 Regex可能就是您想要的 - 其他 @Rich 的答案对我来说看起来不错。
This regex pattern matches on semicolon-delimited number pairs, where a comma separates the members of each pair, and each number is between 1 and 10000:
^([1-9]\d{0,3}|10000),([1-9]\d{0,3}|10000)(;([1-9]\d{0,3}|10000),([1-9]\d{0,3}|10000))*$
There must be at least one pair. If there is only one pair, no semicolon follows it. Semicolons should be present only between neighboring pairs.
我不确定我是否了解您的格式如何工作,但如果所有内容都必须具有格式 [id],[volume];[id],[volume]; 的 ID 和卷。然后我会说使用正则表达式,例如:
(([0-9]),([0-9]);)+
但是您的示例1,3;5,1;6;4
似乎不遵循该格式,因此如果您希望音量是可选的,那么:
(([0-9])(,[0-9])?;)+
应该管用。如果您想尝试正则表达式模式,那么我建议您使用在线实用程序,例如http://regexpal.com