如果字符串太短,子字符串将不起作用

时间:2015-03-26 14:26:47

标签: c# regex substring

我有一个人在我们的计划中输入的电话号码。我们不会在用户端验证号码(不要问......)。所以我所做的是使用RegEx剥离所有外国字符并与另一个RegEx进行比较(这是老板想要的)。

一旦我为这个数字创建了一个普通字符串,我手动将连字符放入字符串中,这样我们的数据库就可以用它来进行比较。

不幸的是,当用户在字符串中放置一个字母时,字符串会缩短一个字符,这会使我的Substring抛出错误。你会如何重写这段代码(我在思考"如果"陈述但是我对这个很新,而且我不想夸大代码,我不会# 39;在这一点上我真的相信自己。)

telephone = Regex.Replace(telephone, "[^0-9.]", "");

StringBuilder sb = new System.Text.StringBuilder();

sb.Append(telephone.Substring(0, 3) 
          + "-" + telephone.Substring(3, 3) 
          + "-" + telephone.Substring(6, 4));

return sb.ToString();

我已经检查了link,但这并不是我想要的。

更新:

预期结果 - 仍然会以少于10个数字(包括少于4个或3个数字)运行。我们的表格仍将填充这些选项。我们在面板上有其他过滤功能,因此面板根据3位数字不会很大

用户只会获得一个更大的列表(这是基于公司协议)。 当我今天运行它时,程序只是挂起而没有更新我们的面板。我必须从VS重新启动调试器,因为我们无法退出程序。

答案:

这是一个混合的答案。我查看了我用于实际电话号码的那个:

telephone = Regex.Replace(telephone, "[^0-9.]", "");
if (telephone.Length > 3)
telephone = telephone.Insert(3, "-");
if (telephone.Length > 7)
telephone = telephone.Insert(7, "-");
return telephone;

然后我必须调整存储过程才能正常工作:

WHERE OfficePhone LIKE '%" +  @newPhone  + "%' ";

谢谢大家的帮助!

2 个答案:

答案 0 :(得分:4)

如果清理后的字符串与预期长度不匹配,您没有说明代码应该做什么。

您似乎希望清理后的号码长度为10个字符(6 + 4)。然后你可以修复它,例如通过抛出异常:

telephone = Regex.Replace(telephone, "[^0-9.]", "");
if (telephone.Length != 10)
{
    throw new ArgumentException("Phone number length incorrect");
}

这里的字符串构建器并没有什么用处。

答案 1 :(得分:3)

我会在这里避免使用StringBuilder。这种方法不会抛出ArgumentOutOfRangeException,如果你的号码有必要的长度,它会插入-

telephone = Regex.Replace(telephone, "[^0-9.]", "");
if (telephone.Length > 3)
    telephone  = telephone.Insert(3, "-");
if (telephone.Length > 7)
    telephone  = telephone.Insert(7, "-");

return telephone;