【问题标题】:Substring will not work if the string is too short如果字符串太短,子字符串将不起作用
【发布时间】:2015-03-26 14:26:47
【问题描述】:

我有一个电话号码,有人将其输入到我们的程序中。我们不会在用户端验证数字(不要问......)。所以我所做的就是用 RegEx 去除所有外来字符并与另一个 RegEx 进行比较(这是老板想要的)。

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

不幸的是,当用户在字符串中放置一个字母时,字符串会缩短一个字符,导致我的 Substring 抛出错误。你将如何重写这段代码(我在想“if”语句,但由于我对此很陌生,我不想夸大代码,所以我现在不太相信自己。)

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  + "%' ";

谢谢大家的帮助!

【问题讨论】:

  • 那么你希望它用较短的文本做什么?示例输入、预期输出以及您尝试过的所有方法都会有所帮助...
  • 您的更新(“仍将运行”)没有回答问题。如果telephone 字符串短于给定的字符数,代码应该如何处理
  • 如果您只是要将传递给Append 的一次调用中的字符串连接起来,那么使用StringBuilder 是没有意义的。
  • @KevinFischer 了解存储过程如何使用这些值可能有助于确定您需要什么,但我的直觉告诉我,存储过程可能必须更改才能正常工作。一般来说,我假设它会按照where phoneNumber like '%' + filterNumber + '%'
  • 这是完全匹配的,除非您的数据库中有部分电话号码,否则我看不出如何在部分上进行匹配。

标签: c# regex substring


【解决方案1】:

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

您似乎希望一个干净的数字长度为 10 个字符 (6 + 4)。然后你可以通过抛出异常来修复它:

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

这里的字符串生成器并没有任何用处。

【讨论】:

  • string.Format 通常看起来更干净:string.Format("{0}-{1}-{2}", telephone.Substring(0, 3), telephone.Substring(3, 3), telephone.Substring(6, 4));
  • 我真的不希望它抛出异常。我仍然希望它运行少于 10 个数字。
  • 我仍然希望它填充我们的表单/过滤器。我更新了我原来的问题。希望这会清除它
【解决方案2】:

我会在这里避免使用 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;

【讨论】:

  • 你能解释一下为什么你不使用StringBuilder吗?
  • @KevinFischer StringBuilder 当您连接大量数据以获得性能优势时才有意义。在这种情况下,您只有一个 10 个字符的字符串 - 有任何 cmets 方法吗?
  • 好的,有道理。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多