如何将一个字符串拆分成固定长度的字符串数组?

4

我有一个类似于这样的长字符串

dim LongString as String = "123abc456def789ghi"

我可以帮你把它分割成一个字符串数组。每个数组元素应该是3个字符长度。

例如,

Dim LongArray(5) As String
LongArray(0)  = "123"
LongArray(1)  = "abc"
LongArray(2)  = "456"
LongArray(3)  = "def"
LongArray(4)  = "789"
LongArray(5)  = "ghi"

我该如何使用VB.net代码拆分它?

1
如果字符串长度不是3的倍数,应该发生什么? - Jon Skeet
@Jon Skeet:它总是3的倍数。 - Yoga Fire
@BlackJack:我已经尝试过了。但是对于我的情况,“delimiter”值是什么? - Yoga Fire
可能是 https://dev59.com/0HM_5IYBdhLWcg3wRw11 的重复问题。 - Paolo Moretti
1
@Yoga Fire:个人而言,我更喜欢在方法内部检查参数,但无论如何...... - Jon Skeet
显示剩余3条评论
8个回答

6
您可以使用 LINQ 实现如下:

' VB.NET
Dim str = "123abc456def789ghij"
Dim len = 3
Dim arr = Enumerable.Range(0, str.Length / len).Select(Function(x) str.Substring(x * len, len)).ToArray()


// C#
var str = "123abc456def789ghij";
var len = 3;
var arr = Enumerable.Range(0, str.Length / len).Select(x => str.Substring(x * len, len)).ToArray();

请注意,这仅适用于长度为 n 的完整字符串(例如,在长度为 10 的字符串中只能取 3 组)。

谢谢您的回答,但是LINQ不支持.Net v1.1。 - Yoga Fire
4
或许你应该写明你还在使用过时的工具! - xanatos
@xanatos 为自己辩护,该问题有一个 .net1.1 标签。 - chrissie1
@chrissie1:只有在xanatos添加它之后。 - Jon Skeet

2
这段C#代码应该可以工作:
public static string[] SplitByLength(string text, int length)
{
    // According to your comments these checks aren't necessary, but
    // I think they're good practice...
    if (text == null)
    {
        throw new ArgumentNullException("text");
    }
    if (length <= 0)
    {
        throw new ArgumentOutOfRangeException("length");
    }
    if (text.Length % length != 0)
    {
        throw new ArgumentException
            ("Text length is not a multiple of the split length");
    }
    string[] ret = new string[text.Length / length];
    for (int i = 0; i < ret.Length; i++)
    {
        ret[i] = text.Substring(i * length, length);
    }
    return ret;
}

Reflector将其转换为VB:

Public Shared Function SplitByLength(ByVal [text] As String, _
                                      ByVal length As Integer) As String()
    ' Argument validation elided
    Dim strArray As String() = New String(([text].Length \ length)  - 1) {}
    Dim i As Integer
    For i = 0 To ret.Length - 1
        strArray(i) = [text].Substring((i * length), length)
    Next i
    Return strArray
End Function

可能这不是VB惯用的写法,所以我也包括了C#。


@Jon 为什么反射器将整数除法转换为非整数(VB.NET)除法?它不应该将“\”转换为“/”吗?它不知道数字始终可被3整除的先决条件。 - xanatos
@Jon,这是由四个VB.NET金徽章人物之一告诉你的 :-) 这更像是一个“反射器是否有bug”的问题。 - xanatos

2

这可能起作用。

 Module Module1

    Sub Main()
        Dim LongString As String = "123abc456def789ghi"
        Dim longlist As New List(Of String)
        For i As Integer = 0 To Convert.ToInt32(LongString.Length / 3) - 1
            longlist.Add(LongString.Substring(i * 3, 3))
        Next
        For Each s As String In longlist
            Console.WriteLine(s)
        Next
        Console.ReadLine()
    End Sub

End Module

这应该可以在 .Net 1.1 中运行。

Module Module1

    Sub Main()
        Dim LongString As String = "123abc456def789ghi"
        Dim longlist(Convert.ToInt32(LongString.Length / 3) - 1) As String
        For i As Integer = 0 To Convert.ToInt32(LongString.Length / 3) - 1
            longlist(i) = (LongString.Substring(i * 3, 3))
        Next
        For i As Integer = 0 To Convert.ToInt32(LongString.Length / 3) - 1
            Console.WriteLine(longlist(i))
        Next
        Console.ReadLine()
    End Sub

End Module

1

我正在将字符串按35分割。

var tempstore ="12345678901234567890123456789012345";

for (int k = 0; k < tempstore.Length; k += 35) {
    PMSIMTRequest.Append(tempstore.Substring(k,
      tempstore.Length - k > 35 ? 35 : tempstore.Length - k));
    PMSIMTRequest.Append(System.Environment.NewLine);
}

messagebox.Show(PMSIMTRequest.tostring());

0

最后一个数组缺失:

Public Function SplitByLength(ByVal text As String, _
                                  ByVal length As Integer) As String()

  ' Argument validation elided
  Dim strArray As String() = New String((text.Length \ length)  - 1) {}
  Dim i As Integer
  For i = 0 To text.Length - 1
      strArray(i) = text.Substring((i * length), length)
  Next i

  ' Get last array:
  ReDim Preserve strArray(i)
  strArray(i) = text.Substring(i * length)
  Return strArray
End Function

0
Dim LongString As String = "1234567"

Dim LongArray((LongString.Length + 2) \ 3 - 1) As String

For i As Integer = 0 To LongString.Length - 1 Step 3
    LongArray(i \ 3) = IF (i + 3 < LongString.Length, LongString.Substring(i, 3), LongString.Substring(i, LongString.Length - i))           
Next

For Each s As String In LongArray
    Console.WriteLine(s)
Next

有一些有趣的部分,例如使用 \ 整数除法(总是向下取整),在 VB.NET 中必须告诉 DIM 数组的最大元素(因此数组的长度为 +1)(这只对 C# 程序员有趣)(并且通过 -1 在 dim 中解决),"+ 2" 的加法(我需要将除以 3 的结果四舍五入,所以我只需将被除数加 2,我可以使用三元运算符和模数,在第一个测试中我就这样做了),以及在获取子字符串时使用三元运算符 IF()。


0
我已经在@jon的代码中添加了一些逻辑。这将完美地处理长度小于传递长度的字符串。
 Public Shared Function SplitByLength(ByVal [text] As String, ByVal length As Integer) As String()

    Dim stringLength = text.Length
    Dim arrLength As Integer = ([text].Length \ length) - 1 + IIf(([text].Length 
                                             Mod length) > 0, 1, 0)
    Dim strArray As String() = New String(arrLength) {}

    Dim returnString As String = ""
    Dim i As Integer
    Dim remLength As Integer = 0

    For i = 0 To strArray.Length - 1
      remLength = stringLength - i * length
      If remLength < length Then
        strArray(i) = [text].Substring((i * length), remLength)
      Else
        strArray(i) = [text].Substring((i * length), length)
      End If
    Next i

       Return  strArray
END FUNCTION

0
这是我的解决方案:
Function splitN(str As String, n As Integer) As String()
  For i = 0 To Len(str) Step n + 1
    Try
      str = str.Insert(i + n, "|")
    Catch
    End Try
  Next
  Return str.Split("|")
End Function

你可以这样调用:splitN("abc123def456frg987ef", 3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接