Подсчет конкретных вхождений символов в строке
каков самый простой способ подсчета количества вхождений определенного символа в строку?
т. е. мне нужно написать функцию countTheCharacters () так что
str="the little red hen"
count=countTheCharacters(str,"e") 'count should equal 4
count=countTheCharacters(str,"t") 'count should equal 3
26 ответов:
самое простое-это просто перебирать символы в строке:
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
использование:
count = CountCharacter(str, "e"C)
другой подход, который почти так же эффективен и дает более короткий код, заключается в использовании методов расширения 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
Это простой способ
text="the little red hen" count = text.Split("e").Length -1 ' Equals 4 count = text.Split("t").Length -1 ' Equals 3
вы можете попробовать это
Dim occurCount As Integer = Len(testStr) - Len(testStr.Replace(testCharStr, ""))
вот простая версия.
text.count(function(x) x = "a")
выше будет дать вам количество а в строке. Если вы хотите игнорировать case:
text.count(function(x) Ucase(x) = "A")
или если вы просто хотели посчитать буквы:
text.count(function(x) Char.IsLetter(x) = True)
дайте ему шанс!
или (in 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
преобразование кода Ujjwal Manandhar в VB.NET следующим образом...
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())
спасибо, @guffa. Возможность сделать это в одной строке или даже в более длинном заявлении в .NET очень удобна. Это VB.NET пример подсчитывает количество символов перевода строки:
Dim j As Integer = MyString.Count(Function(c As Char) c = vbLf)
j возвращает количество строк в строке 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
когда я нашел это решение, я искал что-то немного другое, поскольку строка, которую я хотел подсчитать, была длиннее одного символа, поэтому я придумал это решение:
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 CountCharacter(ByVal value As String, ByVal ch As Char) As Integer Return (New System.Text.RegularExpressions.Regex(ch)).Matches(value).Count End Function
Я думаю, что это было бы проще всего:
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<br/> Loop Until iPos = -1 Return iFound End Function
Код Использование:
Dim iCountTimes As Integer = CountOccurrences("Can I call you now?", "a")
также вы можете иметь его в качестве расширения:
<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
Код Использование:
Dim iCountTimes2 As Integer = "Can I call you now?".CountOccurrences("a")
Я предлагаю вам сделать такой:
String.Replace("e", "").Count String.Replace("t", "").Count
вы также можете использовать
.Split("e").Count - 1
или.Split("t").Count - 1
respetivelly, но он дает неправильные значения, если у вас, например, есть e или t в началеString
eCount = str.Length - Replace(str, "e", "").Length tCount = str.Length - Replace(str, "t", "").Length
еще одна возможность-работать с Split:
Dim tmp() As String tmp = Split(Expression, Delimiter) Dim count As Integer = tmp.Length - 1
Я нашел лучший ответ :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
Я использую следующую функцию. Это не самая эффективная память, но она очень проста в понимании, поддерживает несколько методов сравнения, всего 4 строки, быстро, в основном работает в VBA тоже, найдет не только отдельные символы, но и любую строку поиска (я часто ищу VbCrLf (s)).
единственное, чего не хватает, это возможность начать поиск с другого "начала"
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
одна вещь мне нравится, что он компактен в использовании образец.
str="the little red hen" count=inStC(str,"e") 'count should equal 4 count=inStC(str,"t") 'count should equal 3
пока я здесь, я хотел бы отправить свою функцию inStB, которая вместо того, чтобы возвращать счетчик строки, Она просто вернет логическое значение, если строка поиска присутствует. Мне нужна эта функция часто, и это делает мой код чище.
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
другая возможность заключается в использовании регулярного выражения:
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());
пожалуйста, преобразуйте это в VB.NET.
Я использую LINQ, и решение очень простое:
код в C#:
count = yourString.ToCharArray().Count(c => c == 'e');
код в функции:
public static int countTheCharacters(string str, char charToCount){ return str.ToCharArray().Count(c => c == charToCount); }
вызов функции:
count = countTheCharacters(yourString, 'e');
использование:
Function fNbrStrInStr(strin As Variant, strToCount As String) fNbrStrInStr = UBound(Split(strin, strToCount)) - LBound(Split(strin, strToCount)) End Function
Я
strin
как вариант для обработки очень длинный текст. Разделение может быть на основе нуля или на основе одного для нижнего конца в зависимости от настроек пользователя, и вычитание его обеспечивает правильный подсчет.Я не включил тест для strcount, который был длиннее
strin
для краткости кода.
Какие коды для чего-то так просто:
в C# создайте метод расширения и используйте LINQ.
public static int CountOccurences(this string s, char c) { return s.Count(t => t == c); }
использование:
int count = "toto is the best".CountOccurences('t');
результат: 4.
использование:
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
вот прямой код, который решает проблему 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))
Теперь это удобная функция для решения проблемы 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
пример использования функции:
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