I have an alphanumeric string like sdff45hg589>@#DF456&<jk778P&&FHJ75
, of which I want to extract only the numbers, without using regex or any other functions.
Dim input As String = "sdff45hg589>@#DF456&<jk778P&&FHJ75"
Dim output As String = New String((From c As Char In input Select c Where Char.IsDigit(c)).ToArray())
MsgBox(output) 'Display the output
The message box will display 4558945677875
.
For extracting letters from the same string, I use the following:
Dim input As String = "sdff45hg589>@#DF456&<jk778P&&FHJ75"
Dim output As String = New String((From c As Char In input Select c Where Char.IsLetter(c)).ToArray())
MsgBox (output)
Is this a better way to extract both?
-
2\$\begingroup\$ This appears to be copied from: stackoverflow.com/a/24650229/1305253 \$\endgroup\$rolfl– rolfl2014年08月10日 17:36:59 +00:00Commented Aug 10, 2014 at 17:36
2 Answers 2
If you want to extract both at the same time (I don't know if it is a requirement, it isn't clear in the question) you should iterate once through each character to place them in different lists.
Dim input As String = "sdff45hg589>@#DF456&<jk778P&&FHJ75"
Dim characters As List(Of Char) = New List(Of Char)()
Dim numbers As List(Of Char) = New List(Of Char)()
For Each c As Char In input
If (Char.IsNumber(c)) Then
numbers.Add(c)
ElseIf (Char.IsLetter(c)) Then
characters.Add(c)
End If
Next
'Do whatever you have to do here
Edit
As pointed out @mjolka, since the goal of the user is to show the splitted numbers and letters, a StringBuilder
would be more appropriate. Here is my updated answer :
Dim input As String = "sdff45hg589>@#DF456&<jk778P&&FHJ75"
Dim characters As StringBuilder = New StringBuilder()
Dim numbers As StringBuilder = New StringBuilder()
For Each c As Char In input
If (Char.IsNumber(c)) Then
numbers.Append(c)
ElseIf (Char.IsLetter(c)) Then
characters.Append(c)
End If
Next
'Do whatever you have to do here
-
\$\begingroup\$ I think a
StringBuilder
would be better than aList(Of Char)
. It makes the intention clearer and you can just callnumbers.ToString()
. \$\endgroup\$mjolka– mjolka2014年08月08日 23:07:48 +00:00Commented Aug 8, 2014 at 23:07 -
\$\begingroup\$ That is totally true, I'll update my answer \$\endgroup\$IEatBagels– IEatBagels2014年08月08日 23:08:39 +00:00Commented Aug 8, 2014 at 23:08
you can do this with a very simple regex replace.
Dim match = Regex.Replace("sdff45hg589>@#DF456&<jk778P&&FHJ75", "\D", "")
non-digits is "\D", and then replace it with empty string.
I ran for above data it works fine.
-
\$\begingroup\$ But how to extract letters using this? \$\endgroup\$Sujith Karivelil– Sujith Karivelil2014年08月08日 13:54:24 +00:00Commented Aug 8, 2014 at 13:54
-
1\$\begingroup\$ use \d to remove digit. \$\endgroup\$Paritosh– Paritosh2014年08月08日 14:03:30 +00:00Commented Aug 8, 2014 at 14:03