如何为给定的例子制定正则表达式

时间:2010-09-27 16:58:07

标签: c# regex

我不太熟悉正则表达式。我不得不使用它们,也许每隔几年使用一次,这主要是为了课程工作。无论如何,对于熟悉正则表达式的人来说,以下问题应该是一个相当直接的问题/答案。

我需要确保输入字段的文本遵循以下格式:

x y z

x,y,z

x y z / <same pattern can repeat for almost unlimited length>

x,y,z / <...> // Spaces after the comma are ok

其中x,y和z只能是整数。模式不能混合,所以你不能拥有

x, y, z / x y z / ...

我尝试了以下

([1-9] [1-9] [1-9])

获取x y z部分,但我不知道如何包含'/'和','

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

尝试将正则表达式分解为碎片。然后尝试将它们组合起来。

例如,像1024这样的整数是一个或多个数字的序列,即[0-9]+。等

语法:

digit     ::= [0-9]
space     ::= [ ]
slash     ::= [/]
comma     ::= [,]

integer   ::= digit+
separator ::= space | comma
group     ::= integer separator integer separator integer
group-sep ::= space slash space
groups    ::= group ( group-sep group )*

正则表达式:

([0-9]+[ ,][0-9]+[ ,][0-9]+)([ ][/][ ][0-9]+[ ,][0-9]+[ ,][0-9]+)*

答案 1 :(得分:3)

我想你可以使用

Regex r = new Regex("^([0-9]+([ ,]|, )[0-9]+(\\2)[0-9]+)( [/] ([0-9]+(\\2)[0-9]+(\\2)[0-9]+)+)*$");

var x1 = r.IsMatch("1,2 3");         // false
var x2 = r.IsMatch("1 3 2 / 1 2 3"); // true
var x3 = r.IsMatch("1,3,2");         // true
var x4 = r.IsMatch("1 3 2 / 1");     // false

Console.WriteLine((x1 == false) ? "Correct" : "Error");
Console.WriteLine((x2 == true) ? "Correct" : "Error");
Console.WriteLine((x3 == true) ? "Correct" : "Error");
Console.WriteLine((x4 == false) ? "Correct" : "Error");
Console.ReadLine();

分成小片

[0-9]+  matches any number, even 0. If it can't start with 0
        you will have to change it
[ ,]    the separator allows a space or a comma
\\2     matches the same thing the second group matched (space or comma)

如果由/启动,则第二个大括号匹配或不匹配此序列的迭代次数。

如果所有分隔符必须完全相同,请将它们替换为\\2(只是不要替换第一个分组,即它将与组2匹配)。