VB .NET - Separando Strings com função Split()


A função Split() do VB .NET é muito versátil e pode ser usada em muitos cenários quando precisamos separar strings.

Na verdade a função Split retorna um array de única dimensão contendo o número de substrings separadas no processo dependendo do critério e delimitador usado.

A sintaxe dessa função é a seguinte:

Function Split(
   ByVal Expression As String,
   Optional ByVal Delimiter As String = " ",
   Optional ByVal Limit As Integer = -1,
   Optional ByVal Compare As CompareMethod = CompareMethod.Binary
) As String()

Onde :

- Se Expression for uma string de comprimento zero ("") , a função Split retornará um array de um único elemento contendo a string de comprimento zero.
- Se Delimiter for uma string de comprimento zero, ou se ele não aparecer na Expression, a função Split retornará um array com um único elemento contendo a string Expression por inteiro;
- Quando Limit for igual a -1, a função Split separa a string de entrada a cada ocorrência do delimitador da string e retorna as substring em um array;
- Quando a função Split encontra dois delimitadores em uma linha, ou um no início e outro no fim da string, ele interpreta esses delimitadores como envolvidos por uma string vazia ("");
- O argumento Compare pode conter os seguintes valores:

Constante Descrição Valor
CompareMethod.Binary Realiza uma comparação binária 0
CompareMethod.Text Realiza uma comparação textual 1

A seguir temos exemplos de utilização de Split mostrando como esses parâmetros podem afetar o resultado de retorno da função:

Função Split Valor retornado
Split("40, 12, 19")    {"40," , "12," , "19"}
Split("40, 12, 19", ", ")    {"40", "12", "19"}
Split("40, 12, 19", ", ", 2)    {"40", "12, 19"}
Split("190.168.0.1", ".")    {"190", "168", "0", "1"}
Split("Macoratti e Miriam", " AND ")    {"Macoratti e Miriam"}
Split("Macoratti e Miriam", " AND ", ,CompareMethod.Text)    {"Macoratti", "Miriam"}
Split("macoratti@yahoo.com", "@",1)    {"macoratti@yahoo.com"}
Split("macoratti@yahoo.com", "@",2)    {"macoratti", "yahoo.com"}

Exemplos de utilização da função Split()

Em todos os projetos estaremos usando o Visual Basic 2010 Express Edition em uma aplicação do tipo Windows Forms Application;

Vamos iniciar com um exemplo bem simples onde iremos separar strings com base no delimitador space => (" "c)

  Private Sub btnAplicarSplit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAplicarSplit.Click
      
 ' Vamos separar esta string
        Dim str As String = txtStringEntrada.Text

     
  ' Separa string baseado em spaços
        Dim palavras As String() = str.Split(New Char() {" "c})

      
 ' Percorremos as palavras da strings separadas exibindo-as no ListBox
        Dim palavra As String
        For Each palavra In palavras
            lstResultado.Items.Add(palavra)
        Next
    End Sub

O código é muito simples:

- Recebemos a string e atribuímos a uma variável string chamada str,
- e a seguir alocamos um array identificado como New Char() bem como um array de String() para armazenar as substrings separadas;
- finalmente efetuamos um laço For/Each para percorrer o array de strings e exibimos o resultado no ListBox.

Vamos agora alterar o código do botão Aplicar a função Split para torná-la mais genérica aceitando assim a utilização de outros delimitadores; no exemplo a seguir estamos usando a vírgula como delimitador:

  Private Sub btnAplicarSplit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAplicarSplit.Click
      
 ' Vamos separar esta string
        Dim str As String = txtStringEntrada.Text
        Dim separador() As Char

        'definindo o separador a ser usado
        If txtDelimitador.Text = String.Empty Then
            separador = New Char() {" "c}
        Else
          
 separador = New Char() + txtDelimitador.Text.ToCharArray
        End If

        ' Separa string baseado no delimitador
        Dim palavras As String() = str.Split(separador)

     
  ' Percorremos as palavras da strings separadas exibindo-as no ListBox
        lstResultado.Items.Clear()
        Dim palavra As String
        For Each palavra In palavras
            lstResultado.Items.Add(palavra)
        Next
    End Sub

Ainda podemos usar o parâmetro opcional StringSplitOptions.RemoveEmptyEntries que remove o valor string vazia do array de elementos. A sintaxe da linha para separar a string ficaria assim: (Quando não informada é usada o valor None)

palavras = str.Split(separador, StringSplitOptions.RemoveEmptyEntries)

Outro recurso muito útil é usar o recurso Regex.Split que separa uma string de entrada em posições definidas onde o delimitador é determinado por um modelo de expressão regular.

Para utilizar este método precisamos usar o namespace: Imports System.Text.RegularExpressions

No exemplo a seguir vamos usar o método Regex.Split para extrair palavras de um string onde devemos tratar a pontuação e os demais caracteres que não sejam palavras de forma que não sejam considerados.

 Private Sub btnRegexSplit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegexSplit.Click

     
  ' Vamos separar esta string
    
   Dim palavras As String() = SepararPalavras(txtStringEntrada.Text)

     
  ' Percorremos as palavras da strings separadas exibindo-as no ListBox
        lstResultado.Items.Clear()
        Dim palavra As String
        For Each palavra In palavras
            lstResultado.Items.Add(palavra)
        Next
    End Sub

   
''' <summary>
    ''' Separa as palavras na string
    ''' </summary>

   
Private Function SepararPalavras(ByRef texto As String) As String()
     
  'retorna a string de palavras separadas com base na expressão regular
        Dim expr_regex As String =
txtRegex.Text.Trim()
        Return Regex.Split(texto,
expr_regex)
    End Function

- Neste código estamos chamando a função SepararPalavras com o texto informado na caixa de texto
- A função utiliza o método Regex.Split que usa a expressão regular informada na caixa de texto txtRegex. A expressão regular \W+ indica que '
1 ou mais caracteres especiais e espaço' de forma que esses caracteres serão usados como delimitadores. Isso implicará que somente as palavras serão separadas.

No resultado estamos usando um trecho de um poema de Fernando Pessoa e como resultado vemos todas as palavras, sem qualquer acentuação usada no texto, sendo exibidas como separadas.

O método Regex.Split possui muitos recursos, e um deles, é usar grupos de captura que podem ser usados na expressão Regex.Split, fazendo isso o resultado final da separação irá incluir o grupo de captura usado.

No exemplo abaixo vemos um exemplo desse recurso:

Dim rgx As New Regex("(-)")
Dim s As String() = rgx.Split("erva-de-santa-maria")
       Resultado da separação :
erva
-
de
-
santa
-
maria
O retorno será um array contendo os seguinte elementos: "erva", "-", "de", "-", "santa", "-", "maria"

Creio que esta pequena introdução você já poderá saber como usar a função Split para separar strings em seus projetos.

Pegue o projeto completo aqui: FuncaoSplit.zip

Eu sei é apenas VB .NET, mas eu gosto...

Referências:

José Carlos Macoratti