如何在 VB.net 中将同时包含字母和整数的字符串解析为字符串和整数变量?

How do I parse a string with both letters and integers into string and integer variables in VB.net?

提问人:UnderHill Studio 提问时间:5/14/2023 更新时间:5/16/2023 访问量:133

问:

我正在从文件中读取字符串。每个字符串都有一个字符串组件,后跟 2 个整数组件,由哈希分隔。

字符串示例: “A1-8” “AN9-16” “OUT16-24” “卡德32-40”

有没有一种简单的方法可以将它们解析为一个字符串变量和 2 个整数变量? 例如,对于“AN9-16”,我想得到

StrVar = "AN"
IntVar1 = 9
IntVar2 = 16

提前致谢。

到目前为止,我还没有真正尝试过任何东西。我考虑过查看字符串中的每个字符,然后将其与第一个整数分开,然后与哈希分开,但这似乎过于复杂。

字符串 vb.net 拆分

评论

0赞 Andrew Mortimer 5/14/2023
您可以在连字符上拆分,然后使用正则表达式提取数字:stackoverflow.com/questions/4187356/...
0赞 UnderHill Studio 5/14/2023
这看起来很有希望。我会深入研究它。

答:

2赞 Étienne Laneville 5/14/2023 #1

这是一个简单的解决方案,向您展示了如何一次“遍历”一个字符的字符串以查找分隔符。 可以使用 IsNumeric 确定文本部分的结束位置。然后,使用该位置,使用 Substring 分隔两个部分。最后,使用 Split 分隔“-”上的数字部分:

Sub ParseString(value As String)
    Dim position As Integer = 0

    ' Find all non-numeric characters
    Do While Not IsNumeric(value.Substring(position, 1))
        position += 1
    Loop

    ' Extract text part 
    Dim textPart As String = value.Substring(0, position)

    ' Extract numeric part
    Dim numericPart As String = value.Substring(position + 1)

    ' Split numeric part on -
    Dim numericValues As String() = Strings.Split(numericPart, "-")

    MsgBox("Text part: " & textPart & vbCrLf & "First numeric value: " & numericValues(0) & vbCrLf & "Second numeric value: " & numericValues(1))

End Sub

这是一种原始的执行方法,如果字符串的格式不是所描述的格式,则会失败。尽管如此,它演示了如何将问题分解为更容易解决的部分。


更进一步,您可以定义一个类来返回字符串中的值:

Public Class ItemCode

    Public Property StringValue As String
    Public Property IntegerValue1 As Integer
    Public Property IntegerValue2 As Integer

    ''' <summary>
    ''' Creates a new instance of the <see cref="ItemCode"/> class.
    ''' </summary>
    Public Sub New()
    End Sub

    ''' <summary>
    ''' Creates a new instance of the <see cref="ItemCode"/> class.
    ''' </summary>
    ''' <param name="stringValue"></param>
    ''' <param name="integerValue1"></param>
    ''' <param name="integerValue2"></param>
    Public Sub New(stringValue As String, integerValue1 As Integer, integerValue2 As Integer)
        Me.StringValue = stringValue
        Me.IntegerValue1 = integerValue1
        Me.IntegerValue2 = integerValue2
    End Sub

End Class

可以将此类用作分析函数的返回值。下面是一个使用正则表达式的版本,它使用带有子表达式的模式,该模式收集 4 个组中的匹配项(组 1、2 和 3 包含您的值,或没有匹配项的空字符串):

Public Function GetItemCodeUsingRegEx(value As String) As ItemCode
    Dim regEx As New Regex("(\D+)(\d*)-(\d+)")
    Dim matchCollection As MatchCollection = regEx.Matches(value)
    Return New ItemCode(matchCollection(0).Groups(1).Value, CInt(matchCollection(0).Groups(2).Value), CInt(matchCollection(0).Groups(3).Value))
End Function

最后,用这个新类更新我的原始答案:

Public Function GetItemCode(value As String) As ItemCode
    Dim position As Integer = 0

    ' Find all non-numeric characters
    Do While Not IsNumeric(value.Substring(position, 1))
        position += 1
    Loop

    ' Extract text part 
    Dim textPart As String = value.Substring(0, position)

    ' Extract numeric part
    Dim numericPart As String = value.Substring(position + 1)

    ' Split numeric part on -
    Dim numericValues As String() = Strings.Split(numericPart, "-")

    Return New ItemCode(textPart, CInt(numericValues(0)), CInt(numericValues(1)))

End Function

评论

0赞 UnderHill Studio 5/14/2023
这是我考虑的方法。看到你的例子会有所帮助。谢谢。我希望有更简单的东西。正则表达式可能有效,但我需要弄清楚实现。
0赞 Étienne Laneville 5/15/2023
@UnderHillStudio答案更新为基于正则表达式的函数。
0赞 UnderHill Studio 5/15/2023 #2

我研究了正则表达式,发现它对于我想要做的事情来说太复杂了。我把编码作为一种爱好,花时间学习正则表达式对我来说投资回报率很低。我敢肯定,你们中的一位专家可以想出一两个可以满足我需求的表达方式,但这是我根据艾蒂安的回答所做的。

Private Sub ParseString(ByVal FromStr As String, ByRef StrVar As String,
                             ByRef IntVar1 As Integer, ByRef IntVar2 As Integer)
    Dim p = 0
    Do While Not IsNumeric(FromStr.Substring(p, 1))
        p += 1
    Loop

    StrVar = FromStr.Substring(0, p)

    Dim IntVar() = Split(FromStr.Substring(p), "-")
    IntVar1 = IntVar(0)
    IntVar2 = IntVar(1)

End Sub