web-dev-qa-db-fra.com

Compter des occurrences de caractères spécifiques dans une chaîne

Quel est le moyen le plus simple de compter le nombre d'occurrences d'un caractère spécifique dans une chaîne?

C’est-à-dire qu’il me faut écrire une fonction, compter les caractères (), de sorte que

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

Le plus simple est de simplement parcourir les caractères de la chaîne:

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

Usage:

count = CountCharacter(str, "e"C)

Une autre approche presque aussi efficace et qui donne un code plus court consiste à utiliser les méthodes d’extension 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
64
Guffa

C'est le moyen simple:

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

Tu peux essayer ça 

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

Voici une version simple. 

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

Ce qui précède vous donnerait le nombre de a dans la chaîne. Si vous vouliez ignorer le cas:

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

Ou si vous vouliez juste compter les lettres:

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

Donner un coup de feu!

14
MattB

Merci, @ guffa . La possibilité de le faire en une seule ligne, voire dans une déclaration plus longue dans .NET est très pratique. Cet exemple VB.NET compte le nombre de caractères LineFeed:

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

j renvoie le nombre de sauts de ligne dans MyString.

4
Neil Dunlop

Ou (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
4
JerryOL

Conversion du code d'Ujjwal Manandhar en VB.NET comme suit ...

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())
3
Nikc
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
2
Souvik Bose

Lorsque j'ai trouvé cette solution, je recherchais quelque chose de légèrement différent, car la chaîne que je voulais compter était plus longue qu'un caractère. C'est pourquoi j'ai proposé cette solution:

    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
2
Andrew'
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<br/>
    Loop Until iPos = -1
    Return iFound
End Function

Utilisation du code:

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

Aussi, vous pouvez l'avoir comme une extension:

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

Utilisation du code:

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

Je pense que ce serait le plus facile:

Public Function CountCharacter(ByVal value As String, ByVal ch As Char) As Integer
  Return len(value) - len(replace(value, ch, ""))
End Function
2
Jeremy

Utiliser des expressions régulières ...

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
2
Carter Medlin

Je vous suggère de le faire comme ceci:

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

Vous pouvez également utiliser .Split("e").Count - 1 ou .Split("t").Count - 1 respectivement, mais cela donne des valeurs erronées si, par exemple, vous avez un e ou un t au début de la String.

1
Olex White
eCount = str.Length - Replace(str, "e", "").Length
tCount = str.Length - Replace(str, "t", "").Length
1
Güven Acar

J'utilise LINQ et la solution est très simple:

Code en C #:

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

Le code dans une fonction:

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

Appelez la fonction:

count = countTheCharacters(yourString, 'e');
1
Juan Carlos Velez

Une autre possibilité est de travailler avec Split:

Dim tmp() As String
tmp = Split(Expression, Delimiter)
Dim count As Integer = tmp.Length - 1
1
SwissGuy
    ' 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
0
Ultimatedeath91

J'ai trouvé la meilleure réponse: P:

String.ToString.Count - String.ToString.Replace("e", "").Count
String.ToString.Count - String.ToString.Replace("t", "").Count
0
Olex White

Utilisation:

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

J'ai utilisé strin comme variante pour gérer un texte très long. Le fractionnement peut être basé sur zéro ou basé sur un pour bas niveau en fonction des paramètres utilisateur, et la soustraction permet de garantir le nombre correct.

Je n'ai pas inclus de test pour que strcount soit plus long que strin afin que le code soit concis.

0
Toby Yadon

J'utilise la fonction suivante. Ce n’est pas très efficace en termes de mémoire, mais il est très simple à comprendre, prend en charge plusieurs méthodes de comparaison, n’est que de 4 lignes, est rapide, fonctionne principalement en VBA, trouvera non seulement des caractères individuels, mais également toute chaîne de recherche (je cherche souvent VbCrLf (s)).

La seule chose qui manque est la possibilité de lancer la recherche à partir d'un autre "Démarrer"

    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

Une chose que j’aime bien, c’est qu’il est compact pour utiliser des exemples.

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

Pendant que je suis ici, je voudrais préciser ma fonction inStB qui, au lieu de renvoyer le nombre de chaînes, renverra simplement un booléen si la chaîne de recherche est présente. J'ai souvent besoin de cette fonction, ce qui rend mon code plus propre.

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
0
Shodan

Une autre possibilité consiste à utiliser une expression régulière:

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

S'il vous plaît convertir cela en VB.NET.

0
Ujjwal Manandhar

Quels codes énormes pour quelque chose d'aussi simple:

En C #, créez une méthode d'extension et utilisez LINQ.

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

Usage:

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

Résultat: 4.

0
Fred