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
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
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
Tu peux essayer ça
Dim occurCount As Integer = Len(testStr) - Len(testStr.Replace(testCharStr, ""))
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!
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.
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
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())
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
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
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")
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
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
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
.
eCount = str.Length - Replace(str, "e", "").Length
tCount = str.Length - Replace(str, "t", "").Length
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');
Une autre possibilité est de travailler avec Split:
Dim tmp() As String
tmp = Split(Expression, Delimiter)
Dim count As Integer = tmp.Length - 1
' 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
J'ai trouvé la meilleure réponse: P:
String.ToString.Count - String.ToString.Replace("e", "").Count
String.ToString.Count - String.ToString.Replace("t", "").Count
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.
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
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.
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.