VB.Net中的正则表达式:仅获取从左到右的前几个数字

3

我对正则表达式并不是很熟悉,但是通过在Google上搜索,我发现唯一能够解决我的问题的方法是使用正则表达式。

我有一组字符串,它们的模式如下:

"3 - 橙子, 柠檬"
"4 - 菠萝, 橙子"
"12 - 青柠,草莓"

我目前的代码如下:

Private Sub cmbKelas_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbKelas.SelectedIndexChanged
        LblID.Text = cmbKelas.Text
End Sub

这段代码将输出整个字符串。我想要的是cmbKelas.Text的值被剥离,所以每个字符串都会变成:

"3"
"4"
"12"

只有前面的数字。如果您有评论、建议或指向正确链接/文章的指点,那会很有帮助,因为到目前为止,我找不到易于理解的好教程。

3个回答

4
正则表达式对于这个任务来说有些过度了。
您可以使用IndexOf方法找出第一个空格出现的位置,然后使用Substring方法将字符串开头截取到第一个空格的索引处。
Dim values As String() = New String() { _
    "3 - Orange, Lemon", _
    "4 - Pineapple, Orange", _
    "12 - Lime, Strawberry" _
}

For Each input as String In values
    Dim number As String = input.Substring(0, input.IndexOf(" "))
    Console.WriteLine(number)
Next

或者,您可以使用Split方法按空格拆分,并将拆分结果数组中的第一项取出,如下所示:

For Each input as String In values
    Dim split As String() = input.Split(" "c)
    Dim number As String = split(0)
    Console.WriteLine(number)
Next

1
我个人偏向于使用分割选项,这样如果你将来需要获取这些值(并且可能需要根据逗号拆分单个值),你已经走了一步。 - Dillie-O
@Dillie-O 我同意。如果需要其他数据,使用IndexOf来查找字符串的多个部分肯定是更好的方法。 - Ahmad Mageed
虽然在我的代码上有些问题(可能与导入system.*.*有关),但这种方法听起来更简单,我会保留它以备将来使用。 - Natasha Illyasviel
@Natasha 这些方法是 System 命名空间的一部分,通常默认存在 (Imports System)。同时,请确保将 SubstringSplit 的结果分配给变量(就像我所做的那样)或属性,因为字符串是不可变的;字符串方法返回一个新的字符串,它们不会影响原始字符串对象。 - Ahmad Mageed

1
如果你想使用正则表达式来实现这个功能,可以尝试使用类似于下面的代码:
Dim ResultString As String
ResultString = Regex.Match(SubjectString, "^\d+").Value

其中SubjectString是您要搜索的字符串。

解释(因为您是正则表达式新手):

  • ^表示字符串的开头(这就是为什么您不匹配不在开头的数字)
  • \d表示数字0-9(它是[0-9]的简写形式,可以做相同的事情)
  • +表示前一个字符至少匹配一次。

这样,您将匹配字符串开头的1到无限位数的数字。


1
作为 SubString 的替代方案,您可以使用 Split
Dim numbers = new List(Of String)()
For Each input as String In values
    Dim parts = input.Split(New Char() {" "c})
    If (parts.Length > 0) Then
        numbers.Add(parts[0])
    End If
Next

与子字符串相同,它在我的代码中不起作用,但是非常感谢您的帮助,我会将语法保存以备将来需要时使用。谢谢。 - Natasha Illyasviel
@Natasha Illyasviel:虽然您现在已经有了解决方案,但您能详细说明这个解决方案有什么问题吗?您是否遇到了错误?我们仍然可以为您提供一个可能更便宜的方法来完成此操作。 - Grant Thomas
因为我在非数组上使用它,所以我将其修改为:<br/><pre>Dim parts As String parts = cmbKelas.Text.Split(New Char() {" "c})</pre><br/><br/>错误是:"无法将一维数组的值转换为字符串"。 - Natasha Illyasviel
@Natasha Illyasviel:哦,我明白了,你有一个包含所有这些元素的单个字符串 - 在这种情况下,您可能希望将其拆分为完整预期字符串的段,然后进行操作,另一方面,您可能只想坚持使用正则表达式。 ;) - Grant Thomas
@Natasha Illyasviel:啊,根据你的最新评论:你尝试将结果分配给任何东西吗?例如一个现有的变量?你看,parts不是像它的输入一样的单个字符串,而是由结果字符串组成的数组,而numbers将是一个字符串列表。 - Grant Thomas

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