Contar ocorrências de caracteres específicos na string

Qual é a maneira mais simples de contar o número de ocorrências de um caractere específico em uma string?

ou seja, eu preciso escrever uma function countTheCharacters () para que

str="the little red hen" count=countTheCharacters(str,"e") 'count should equal 4 count=countTheCharacters(str,"t") 'count should equal 3 

O mais simples é simplesmente percorrer os caracteres na string:

 Public Function CountCharacter(ByVal value As String, ByVal ch As Char) As Integer Dim cnt As Integer = 0 For Each c As Char In value If c = ch Then cnt += 1 End If Next Return cnt End Function 

Uso:

 count = CountCharacter(str, "e"C) 

Outra abordagem que é quase tão eficaz e dá código mais curto é usar os methods de extensão LINQ:

 Public Function CountCharacter(ByVal value As String, ByVal ch As Char) As Integer Return value.Count(Function(c As Char) c = ch) End Function 

Essa é a maneira mais simples

 text="the little red hen" count = text.Split("e").Length -1 ' Equals 4 count = text.Split("t").Length -1 ' Equals 3 

Você pode tentar isso

 Dim occurCount As Integer = Len(testStr) - Len(testStr.Replace(testCharStr, "")) 

Aqui está uma versão simples.

 text.count(function(x) x = "a") 

O acima lhe daria o número de a’s na string. Se você quisesse ignorar o caso:

 text.count(function(x) Ucase(x) = "A") 

Ou se você só queria contar cartas:

 text.count(function(x) Char.IsLetter(x) = True) 

Dê uma chance!

Ou (em VB.NET):

 Function InstanceCount(ByVal StringToSearch As String, ByVal StringToFind As String) As Long If Len(StringToFind) Then InstanceCount = UBound(Split(StringToSearch, StringToFind)) End If End Function 

Conversão do código de Ujjwal Manandhar para VB.NET da seguinte forma …

 Dim a As String = "this is test" Dim pattern As String = "t" Dim ex As New System.Text.RegularExpressions.Regex(pattern) Dim m As System.Text.RegularExpressions.MatchCollection m = ex.Matches(a) MsgBox(m.Count.ToString()) 

Obrigado, @guffa . A capacidade de fazer isso em uma linha, ou mesmo em uma instrução mais longa no .NET, é muito útil. Este exemplo do VB.NET conta o número de caracteres do LineFeed:

 Dim j As Integer = MyString.Count(Function(c As Char) c = vbLf) 

j retorna o número de LineFeeds em MyString.

 Public Class VOWELS Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim str1, s, c As String Dim i, l As Integer str1 = TextBox1.Text l = Len(str1) c = 0 i = 0 Dim intloopIndex As Integer For intloopIndex = 1 To l s = Mid(str1, intloopIndex, 1) If (s = "A" Or s = "a" Or s = "E" Or s = "e" Or s = "I" Or s = "i" Or s = "O" Or s = "o" Or s = "U" Or s = "u") Then c = c + 1 End If Next MsgBox("No of Vowels: " + c.ToString) End Sub End Class 

Quando encontrei esta solução, estava procurando algo um pouco diferente, pois a string que eu queria contar era maior que um caractere, então eu criei essa solução:

  Public Shared Function StrCounter(str As String, CountStr As String) As Integer Dim Ctr As Integer = 0 Dim Ptr As Integer = 1 While InStr(Ptr, str, CountStr) > 0 Ptr = InStr(Ptr, str, CountStr) + Len(CountStr) Ctr += 1 End While Return Ctr End Function 

Usando expressões regulares …

 Public Function CountCharacter(ByVal value As String, ByVal ch As Char) As Integer Return (New System.Text.RegularExpressions.Regex(ch)).Matches(value).Count End Function 

Eu acho que isso seria o mais fácil:

 Public Function CountCharacter(ByVal value As String, ByVal ch As Char) As Integer Return len(value) - len(replace(value, ch, "")) End Function 
 Public Function CountOccurrences(ByVal StToSerach As String, ByVal StToLookFor As String) As Int32 Dim iPos = -1 Dim iFound = 0 Do iPos = StToSerach.IndexOf(StToLookFor, iPos + 1) If iPos <> -1 Then iFound += 1 End If
Loop Until iPos = -1 Return iFound End Function

Uso de código:

 Dim iCountTimes As Integer = CountOccurrences("Can I call you now?", "a") 

Além disso, você pode tê-lo como uma extensão:

  _ Public Function CountOccurrences(ByVal StToSerach As String, ByVal StToLookFor As String) As Int32 Dim iPos = -1 Dim iFound = 0 Do iPos = StToSerach.IndexOf(StToLookFor, iPos + 1) If iPos <> -1 Then iFound += 1 End If Loop Until iPos = -1 Return iFound End Function 

Uso de código:

 Dim iCountTimes2 As Integer = "Can I call you now?".CountOccurrences("a") 

Eu sugiro que você faça assim:

 String.Replace("e", "").Count String.Replace("t", "").Count 

Você também pode usar .Split("e").Count - 1 ou .Split("t").Count - 1 respetivelly, mas dá valores errados se você, por exemplo, tiver um e ou no início da String

 eCount = str.Length - Replace(str, "e", "").Length tCount = str.Length - Replace(str, "t", "").Length 

Outra possibilidade é trabalhar com o Split:

 Dim tmp() As String tmp = Split(Expression, Delimiter) Dim count As Integer = tmp.Length - 1 

Eu encontrei a melhor resposta: P:

 String.ToString.Count - String.ToString.Replace("e", "").Count String.ToString.Count - String.ToString.Replace("t", "").Count 
  'trying to find the amount of "." in the text 'if txtName looks like "hi...hi" then intdots will = 3 Dim test As String = txtName.Text Dim intdots As Integer = 0 For i = 1 To test.Length Dim inta As Integer = 0 + 1 Dim stra As String = test.Substring(inta) If stra = "." Then intdots = intdots + 1 End If Next txttest.text = intdots 

var charCount = "string with periods...".Count(x => '.' == x);

Eu uso a seguinte function. Não é a memory mais eficiente, mas é muito simples de entender, suporta vários methods de comparação, é de apenas 4 linhas, é rápido, funciona principalmente em VBA também, vai encontrar não apenas caracteres individuais, mas qualquer seqüência de pesquisa (muitas vezes eu pesquiso VbCrLf (s)).

A única coisa que falta é a capacidade de iniciar a pesquisa a partir de um “Start” diferente

  Function inStC(myInput As String, Search As String, Optional myCompareMethod As Long = CompareMethod.Text) As Long If InStr(1, myInput, Search, myCompareMethod) = 0 Then Return 0 Return UBound(Split(myInput, Search,, myCompareMethod)) End Function 

Uma coisa que eu gosto é que é compacto usar exemplo.

 str="the little red hen" count=inStC(str,"e") 'count should equal 4 count=inStC(str,"t") 'count should equal 3 

Enquanto eu estou aqui, eu gostaria de shill minha function inStB, que, em vez de retornar uma contagem de uma string, ele simplesmente retornará um booleano se a string de pesquisa estiver presente. Eu preciso dessa function frequentemente e isso torna meu código mais limpo.

 Function inStB(myInput As String, Search As String, Optional Start As Long = 1, Optional myCompareMethod As Long = CompareMethod.Text) As Boolean If InStr(Start, myInput, Search, myCompareMethod) > 0 Then Return True Return False End Function 

Outra possibilidade é usar uma expressão regular:

 string a = "this is test"; string pattern = "t"; System.Text.RegularExpressions.Regex ex = new System.Text.RegularExpressions.Regex(pattern); System.Text.RegularExpressions.MatchCollection m = ex.Matches(a); MessageBox.Show(m.Count.ToString()); 

Por favor, converta isso em VB.NET.

Eu uso o LINQ e a solução é muito simples:

Código em C #:

 count = yourString.ToCharArray().Count(c => c == 'e'); 

O código em uma function:

 public static int countTheCharacters(string str, char charToCount){ return str.ToCharArray().Count(c => c == charToCount); } 

Chame a function:

 count = countTheCharacters(yourString, 'e'); 

Usar:

 Function fNbrStrInStr(strin As Variant, strToCount As String) fNbrStrInStr = UBound(Split(strin, strToCount)) - LBound(Split(strin, strToCount)) End Function 

Eu usei strin como variante para lidar com texto muito longo. A divisão pode ser baseada em zero ou baseada em um para baixo, dependendo das configurações do usuário, e a subtração garante a contagem correta.

Eu não incluí um teste para o strcount sendo mais longo que strin para manter o código conciso.

Que códigos enormes para algo tão simples:

Em C #, crie um método de extensão e use o LINQ.

 public static int CountOccurences(this string s, char c) { return s.Count(t => t == c); } 

Uso:

 int count = "toto is the best".CountOccurences('t'); 

Resultado: 4.

Usar:

 Dim a inputString = InputBox("Enter String", "Enter Value", "") MyString = UCase(inputString) MsgBox MyString Dim stringLength stringLength = Len(MyString) Dim temp output = "" i = 1 Do temp = Mid(MyString, i, 1) MsgBox temp & i CharacterCount = len(MyString) - len(Replace(MyString, temp, "")) MyString = Replace(MyString, temp, "") output = output & temp & ": " & CharacterCount & vbNewline Loop While MyString <> "" MsgBox output 
 Private Sub Data_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Data.KeyPress If Not IsNumeric(e.KeyChar) And Not e.KeyChar = ChrW(Keys.Back) And Not e.KeyChar = "." Then e.Handled = True Else If e.KeyChar = "." And Data.Text.ToCharArray().Count(Function(c) c = ".") > 0 Then e.Handled = True End If End If End Sub 

Aqui está o código direto que resolve o problema do OP:

  Dim str As String = "the little red hen" Dim total As Int32 Dim Target As String = "e" Dim Temp As Int32 Dim Temp2 As Int32 = -1 Line50: Temp = str.IndexOf(Target, Temp2 + 1) Temp2 = Temp If Temp <> -1 Then ' Means there is a target there total = total + 1 GoTo Line50 End If MessageBox.Show(CStr(total)) 

Agora, esta é uma function útil para resolver o problema do OP:

  Public Function CountOccurrence(ByVal YourStringToCountOccurrence As String, ByVal TargetSingleCharacterToCount As String) As Int32 Dim total As Int32 Dim Temp As Int32 Dim Temp2 As Int32 = -1 Line50: Temp = YourStringToCountOccurrence.IndexOf(TargetSingleCharacterToCount, Temp2 + 1) Temp2 = Temp If Temp <> -1 Then ' Means there is a target there total = total + 1 GoTo Line50 Else Return total End If End Function 

Exemplo de uso da function:

 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim str As String = "the little red hen" MessageBox.Show(CStr(CountOccurrence(str, "e"))) ' It will return 4 End Sub