3
\$\begingroup\$

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?

Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Aug 8, 2014 at 8:51
\$\endgroup\$
1

2 Answers 2

3
\$\begingroup\$

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
answered Aug 8, 2014 at 15:03
\$\endgroup\$
2
  • \$\begingroup\$ I think a StringBuilder would be better than a List(Of Char). It makes the intention clearer and you can just call numbers.ToString(). \$\endgroup\$ Commented Aug 8, 2014 at 23:07
  • \$\begingroup\$ That is totally true, I'll update my answer \$\endgroup\$ Commented Aug 8, 2014 at 23:08
2
\$\begingroup\$

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.

answered Aug 8, 2014 at 8:59
\$\endgroup\$
2
  • \$\begingroup\$ But how to extract letters using this? \$\endgroup\$ Commented Aug 8, 2014 at 13:54
  • 1
    \$\begingroup\$ use \d to remove digit. \$\endgroup\$ Commented Aug 8, 2014 at 14:03

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.