将字符串解析为数组 (VB)

Parsing String into an Array (VB)

我试图制作一个程序,将 Chrome://policy(由 RichTextbox 输入)中的原始列表解析为文本数组,然后将其转储到另一个 RichTextbox 中。所有原始字符串的长度都是 32 个字符,后跟一个逗号。这是代码:

Public Class Form1
    Dim tempExt As String
    Dim extsHandled As Integer
    Dim numOfExts As Integer
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If RichTextBox1.Text = "" Then
            MsgBox("Please enter the raw extensions from Chrome://policy")
        Else
            RichTextBox3.Text = RichTextBox1.Text
            numOfExts = TextBox1.Text
            Dim place As Integer = 0
            Dim exts(150) As String
            While extsHandled < numOfExts
                tempExt = RichTextBox1.Text.Substring(0, 32)
                exts(place) = tempExt
                RichTextBox1.Text.Remove(0, 33)
                place = place + 1
                extsHandled = extsHandled + 1
            End While
            Dim newPlace As Integer = 0
            While newPlace < numOfExts
                RichTextBox2.AppendText(exts(newPlace))
                newPlace = newPlace + 1
                RichTextBox2.AppendText(" ")
            End While

        End If
    End Sub
End Class

大部分都有效,但是从 richtextbox 中删除字符似乎出了点问题,因为当我 运行 它时,它只一遍又一遍地解析字符串的第一部分:

我是不是做错了什么?

这一行returns一个新字符串:

RichTextBox1.Text.Remove(0, 33)

它不会就地修改文本框。循环的下一次迭代,您仍在使用原始值,查看字符串开头的同一组 32 个字符。

此外,此代码中没有任何内容初始化 extsHandled 变量。您应该打开 Option Strict,这有助于捕获此类错误。 运行 Option Strict off 是不好的做法。您还应该为您实际从代码中引用的任何控件指定一个有意义的名称。

我现在还不清楚确切的格式。如果它们都在同一行(没有换行符作为字符串的一部分,即使它换行),这应该有效:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If String.IsNullOrWhitespace(RichTextBox1.Text) Then
        MsgBox("Please enter the raw extensions from Chrome://policy")
        Exit Sub
    End If

    RichTextBox3.Text = RichTextBox1.Text
    Dim exts() As String
    Using rdr As New TextFieldParser(RichTextBox1.Text)
        rdr.TextFieldType = FileIO.FieldType.Delimited
        rdr.Delimiters = New String() {","}
        exts = rdr.ReadFields()
    End Using

    For Each ext As String In exts
         RichTextBox2.AppendText(ext)
    Next ext

    RichTextBox1.Text = ""
End Sub

问题是这段代码没有做任何事情。方法结束时数组消失了。考虑使数组成为 class 的 属性,或者使用 returns 数组作为结果的方法。

您也可以看看这个,以节省在文本框中输入的时间,尽管这只是一个起点:

Public Function GetChromeExtensionKeys() As IEnumerable(Of String)
    Dim BasePath As String = 
EndEnvironment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
    BasePath = Path.Combine(BasePath, "Google\Chrome\User Data")

    Dim dflt As String = Path.Combine(BasePath, "Default\Extensions")
    Dim profileExts() As String = Directory.GetDirectories(BasePath, "Profile *").
          Select(Function(p) Path.Combine(p, "Extensions"))

    Dim result As New List(Of String)()
    result.AddRange(Directory.GetDirectories(dflt))
    For Each folder As String In profiles
        result.AddRange(Directory.GetDirectories(folder))
    Next folder   

    Return result.Select(Function(e) Path.GetFileName(e)).Distinct()
Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For Each ext As String In GetChromeExtensionKeys()
         RichTextBox2.AppendText(ext)
    Next ext
End Sub

如果总是这样你可以这样做:

RichTextBox3.Text = RichTextBox1.Text.Replace(",", vbNewLine)

#3 是您的结果,而#1 是原始结果对吗?

嗯嗯,你可以数一数有多少

RichTextBox2.Text=  RichTextBox1.Text.Split({","}, StringSplitOptions.RemoveEmptyEntries).Count.ToString