提问人:UnderHill Studio 提问时间:5/14/2023 更新时间:5/16/2023 访问量:133
如何在 VB.net 中将同时包含字母和整数的字符串解析为字符串和整数变量?
How do I parse a string with both letters and integers into string and integer variables in VB.net?
问:
我正在从文件中读取字符串。每个字符串都有一个字符串组件,后跟 2 个整数组件,由哈希分隔。
字符串示例: “A1-8” “AN9-16” “OUT16-24” “卡德32-40”
有没有一种简单的方法可以将它们解析为一个字符串变量和 2 个整数变量? 例如,对于“AN9-16”,我想得到
StrVar = "AN"
IntVar1 = 9
IntVar2 = 16
提前致谢。
到目前为止,我还没有真正尝试过任何东西。我考虑过查看字符串中的每个字符,然后将其与第一个整数分开,然后与哈希分开,但这似乎过于复杂。
答:
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
上一个:文本框数据不对称
评论