2013-12-15 48 views
1

我是C#的初学者,试图学习自己,我正在做一个需要以下内容的练习。分割字符串并单独检查

制作一个标签,文本框和按钮,文本框包含一个格式为XXX-XXX-XXX的数字,其中每个X是一个0-9的数字。因此,我必须检查给定的号码是否有效(9位数字),以及号码的前三位是(070,071,072,075,076,077,078)。

所以基本上,每个号码必须以这3个数字开始,然后检查其余6位数字,如果它们是6(不多于),并且它们是0-9的数字。

这里是我到目前为止的代码:

private void btnProveri_Click(object sender, EventArgs e) 
{ 
    string s = txtTelefon.Text; 
    string[] nums = s.Split('-'); 
    foreach (string num in nums) 
    { 
     if (num.Length > 3) 
     { 
      lblRezultat.Text = "Invalid number."; 
      break; 
     } 
    } 
} 

我怎样才能做到这一点进一步?检查前三位数字是否是特定数字,并检查其余数字是否分别为3位数(检查数字是否为0-9(不是字符)也是好的)。

+1

听起来像是一个正则表达式的工作。 –

+0

你是否必须使用'Split'?那么正则表达式呢?就像'^ [070 | 071 | 072 | 075 | 076 | 077 | 078](\ - \ d {3}){2} $'(离开我的头顶部..可能有点偏离,但这个想法是以查看前3位数字是否与您要查找的内容匹配,然后是2组'-'和3位数字。 – Tim

+0

是的,我不得不使用Split()不幸..(任务指定)我想先用Split()解决,然后用Regex解决它,以改善我的C#。 – user2699298

回答

5

在以下解决方案中,您可以使用IEnumerable.Contains()检查符合条件的第一位数字。这会根据您的价值检查每个成员。

然后确保每个值是三个数字后,我试图将其转换为整数,以确保它在正确的格式与Int32.TryParse

string s = txtTelefon.Text; 
string[] nums = s.Split('-'); 
int counter = 0; 
IEnumerable<string> first = new List<string> { "070", "071", "072", "075", "076", "077", "078" }; 
foreach (string num in nums) 
{ 
    if (num.Length != 3) 
    { 
     lblRezultat.Text = "Invalid number."; 
     break; 
    } 
    else if (counter==0) 
    { 
     if (!first.Contains(num)) 
     { 
      // first 3 digits don't match pattern 
      break; 
     } 
    } 
    else 
    { 
     int try = 0; 
     if (!int.TryParse(num, try)) 
     { 
      // not a 3 digit number 
      break; 
     } 
    } 

    counter++ 
} 
if (counter != 3) 
{ 
    // wrong number of splits (111-222-333-444) 
} 
+0

你能解释我什么IEnumerable 第一是?(对不起,如果它是明显的问题,我很新到C#) – user2699298

+0

我更新了我的答案,指向你的文档 – Harrison

+0

很好的答案,谈到什么OP是具体问(没有正则表达式,LINQ等) – kaveman

0
var s = "XXX-XXX-XXX"; 
    if (!Regex.IsMatch(s, @"^[070|071|072|075|076|077|078]-\d{3}-\d{3}$"))) 
    { 
     //wrong format 
    } 
+1

这将匹配111-322-211,这不是OP所要查找的。 – Tim

+0

前3位必须匹配070,071,072,075,076,077,078(和其他一些我会补充我自己) – user2699298

+0

我已经修复了我的答案 - 对不起 – user3041160

2

给在你的问题的示例的单个正则表达式可以解决这个问题:

var pattern = @"^07[0125678]-\d{3}-\d{3}$" 

上面将匹配开始07X与X任何字符串在方括号中,其次是连字符,然后三位数字,重复两次。

if(!Regex.IsMatch(txtTelefon.Text, pattern)) 
{ 
    lblRezultat.Text = "Invalid number."; 
} 
5

这LINQ方法应该工作,没有必要对它进行解析到int或使用正则表达式:

string[] nums = "076-123-456".Split('-'); 
var startNums = new[]{"070","071","072","075","076","077","078"}; 
bool valid = nums.Length == 3 && 
      startNums.Contains(nums[0]) && 
      nums.Skip(1).All(n => n.Length==3 && n.All(Char.IsDigit)); 
+0

数字会有一个整洁的LINQ方法:)虽然是第二行一个错字:'if(valid)valid = valid = startNums.Contains(nums [0]);'?看起来像一个额外的'valid ='在那里。 – Tim

+1

不错的简单解决方案。 Linq让所有事情都变得更加紧凑+1 – Harrison