.NET Fiddle

VbNet · Console

/Program.vb

Imports System
Imports System.Collections.Generic
Public Module Module1

    Public Sub Main()
		Dim input As String = String.Join(Environment.NewLine, { _
				"@hello friend", _
				"@ hello friend", _
				"hey@hello @hello", _
				"@hello! hi @hello #hi ##hello"})

        Console.WriteLine("Mentions: {0}", String.Join(", ", FindTags("@"c, input)))
        Console.WriteLine("Hashtags: {0}", String.Join(", ", FindTags("#"c, input)))
        Console.ReadLine()
    End Sub

    Private Function FindTags(ByVal lead As Char, ByVal source As String) As String()
        Dim matches As List(Of String) = New List(Of String)
        Dim current_index As Integer = 0

        'Loop through all but the last character in the source
        For index As Integer = 0 To source.Length - 2
            'Reset the current index
            current_index = index

		'Check if the current character is a "@" or "#" and either we're starting at the beginning of the String or the last character was whitespace and then if the next character is a letter, digit, or end of the String
            If source(index) = lead AndAlso (index = 0 OrElse Char.IsWhiteSpace(source, index - 1)) AndAlso (Char.IsLetterOrDigit(source, index + 1) OrElse index + 1 = source.Length - 1) Then
                'Loop until the next character is no longer a letter or digit
                Do
                    current_index += 1
                Loop While current_index + 1 < source.Length AndAlso Char.IsLetterOrDigit(source, current_index + 1)

                'Check if we're at the end of the line or the next character is whitespace
                If current_index = source.Length - 1 OrElse Char.IsWhiteSpace(source, current_index + 1) Then
                    'Add the match to the collection
                    matches.Add(source.Substring(index, current_index + 1 - index))
                End If
            End If
        Next

        Return matches.ToArray()
    End Function

End Module
;