【问题标题】:Split string into multiple smaller strings将字符串拆分为多个较小的字符串
【发布时间】:2017-05-31 09:55:45
【问题描述】:

我有一个多行文本框,其中包含用逗号分隔的 10 位手机号码。我需要在至少 100 个手机号码的组中实现字符串。

100个手机号码一共用99个逗号隔开。我正在尝试编码的是拆分包含小于 100 的逗号的字符串

public static IEnumerable<string> SplitByLength(this string str, int maxLength) 
  {
    for (int index = 0; index < str.Length; index += maxLength) {
    yield return str.Substring(index, Math.Min(maxLength, str.Length - index));
  }
}

通过使用上面的代码,我可以实现100个号码,因为100个号码的文本长度为10*100(手机号)+99(逗号)。但这里的问题是用户可能会输入错误的手机号码,比如 9 位甚至 11 位。

谁能指导我如何实现这一目标。 提前谢谢你。

【问题讨论】:

  • 因此您的问题不是拆分而是输入的验证?
  • "用户可能输入了错误的手机号码" 但是您的用户当然总是会正确使用逗号?看来您需要在进一步处理之前验证您的输入。
  • 不要使用这样的字段。如果有的话,用户很难正确输入数据。一个快速而肮脏的解决方案是使用多行文本框。对于人类来说,换行符是比逗号更好的分隔符。更好的是,使用显示所有项目的可编辑组合框。您可以单独验证修改的项目。您只需要一个Add 按钮即可添加新项目。
  • 你应该检查输入的值是否正确,也许使用一些正则表达式。如果您只想检查 1 个电话号码,您可以根据您想要的电话格式执行([0-9]{10}) 之类的操作或更好的操作。如果您想检查字符串(带逗号)是否有效,请执行([0-9]{10},){100}([0-9]{10},)*,具体取决于您是否总是需要 100 个电话号码或至少一个
  • 逗号会在10位后自动添加,但问题是它也支持excel上传,可能有错误的数字

标签: c# string split


【解决方案1】:

您可以使用此扩展方法将它们放入最多 100 个数字组中:

public static IEnumerable<string[]> SplitByLength(this string str, string[] splitBy, StringSplitOptions options, int maxLength = int.MaxValue)
{
    var allTokens = str.Split(splitBy, options);
    for (int index = 0; index < allTokens.Length; index += maxLength)
    {
        int length = Math.Min(maxLength, allTokens.Length - index);
        string[] part = new string[length];
        Array.Copy(allTokens, index, part, 0, length);
        yield return part;
    }
}

示例:

string text = string.Join(",", Enumerable.Range(0, 1111).Select(i => "123456789"));
var phoneNumbersIn100Groups = text.SplitByLength(new[] { "," }, StringSplitOptions.None, 100);
foreach (string[] part in phoneNumbersIn100Groups)
{
    Assert.IsTrue(part.Length <= 100);
    Console.WriteLine(String.Join("|", part));
}

【讨论】:

    【解决方案2】:

    你有几个选择,

    1. 在输入数据上放置某种掩码,以防止用户输入无效数据。然后,您可以在您的 UI 中标记错误并提示用户重新输入正确的信息。如果你沿着这条路走,那么像 string[] nums = numbers.Split(','); 这样的东西就可以了。
    2. 或者,您可以使用 regex.split 或 regex.match 并匹配模式。假设您的数字在带有前导逗号或空格的字符串中,这样的事情应该可以工作

      正则表达式 regex = new Regex("(\s|,)\d{10},)";

      string[] nums = regex.Split(numbers);

    【讨论】:

      【解决方案3】:

      这可以通过一个简单的 Linq 代码解决

      public static IEnumerable<string> SplitByLength(this string input, int groupSize)
      {
          // First split the input to the comma.
          // this will give us an array of all single numbers
          string[] numbers = input.Split(',');
      
          // Now loop over this array in groupSize blocks
          for (int index = 0; index < numbers.Length; index+=groupSize)
          {
              // Skip numbers from the starting position and 
              // take the following groupSize numbers, 
              // join them in a string comma separated and return 
              yield return string.Join(",", numbers.Skip(index).Take(groupSize));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2012-03-31
        相关资源
        最近更新 更多