Cuente las ocurrencias de caracteres específicos en una cadena

¿Cuál es la forma más simple de contar el número de apariciones de un personaje específico en una cadena?

es decir, necesito escribir una función countTheCharacters () para que

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

Lo más sencillo es simplemente recorrer los caracteres de la cadena:

 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) 

Otro enfoque que es casi tan efectivo y da un código más corto es usar métodos de extensión 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 

Esta es la manera simple

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

Puedes intentar esto

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

Aquí hay una versión simple.

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

Lo anterior le daría el número de a en la cadena. Si quisiera ignorar el caso:

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

O si solo quieres contar cartas:

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

¡Dale un tiro!

O (en 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 

Conversión del código de Ujjwal Manandhar a VB.NET de la siguiente manera …

 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()) 

Gracias, @guffa . La capacidad de hacerlo en una línea, o incluso dentro de una statement más larga en .NET es muy útil. Este ejemplo de VB.NET cuenta el número de caracteres de LineFeed:

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

j devuelve el número de LineFeeds en 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 

Cuando encontré esta solución, estaba buscando algo ligeramente diferente ya que la cadena que quería contar tenía más de un carácter, así que se me ocurrió esta solución:

  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 expresiones 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 

Creo que esto sería lo más 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 del código:

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

También puedes tenerlo como una extensión:

  _ 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 del código:

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

Te sugiero que hagas esto:

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

También puede usar .Split("e").Count - 1 o .Split("t").Count - 1 respetivamente, pero da valores incorrectos si usted, por ejemplo, tiene una e o al principio de la String

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

Otra posibilidad es trabajar con Split:

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

Encontré la mejor respuesta: 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);

Yo uso la siguiente función. No es el más eficaz desde el punto de vista de la memoria, pero es muy simple de entender, es compatible con múltiples métodos de comparación, tiene solo 4 líneas, es rápido, funciona principalmente en VBA, no solo encontrará caracteres individuales sino también cualquier cadena de búsqueda (a menudo busco VbCrLf (s)).

Lo único que falta es la capacidad de comenzar a buscar desde un “Inicio” 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 

Una cosa que me gusta es que es compacto para usar el ejemplo.

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

Mientras estoy aquí, me gustaría compartir mi función inStB, que, en lugar de devolver un conteo de una cadena, simplemente devolverá un valor booleano si la cadena de búsqueda está presente. Necesito esta función a menudo y esto hace que mi código sea más limpio.

 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 

Otra posibilidad es usar una expresión 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 conviértalo en VB.NET.

Yo uso LINQ, y la solución es muy simple:

Código en C #:

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

El código en una función:

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

Llame a la función:

 count = countTheCharacters(yourString, 'e'); 

Utilizar:

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

strin como variante para manejar texto muy largo. La división puede ser basada en cero o en una base para el extremo bajo, dependiendo de la configuración del usuario, y restarla asegura el recuento correcto.

No incluí una prueba para strcount siendo más larga que strin para mantener el código conciso.

Qué grandes códigos para algo tan simple:

En C #, crea un método de extensión y usa 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.

Utilizar:

 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 

Aquí está el código directo que resuelve el problema del 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)) 

Ahora, esta es una función práctica para resolver el problema del PO:

  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 

Ejemplo de uso de la función:

 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