it-swarm.com.ru

Подсчет вхождений определенных символов в строку

Какой самый простой способ подсчитать количество вхождений определенного символа в строку?

То есть мне нужно написать функцию countTheCharacters (), чтобы

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

Самое простое - просто перебрать символы в строке:

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
64
Guffa

Это простой способ:

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

Вы можете попробовать это 

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

Вот простая версия. 

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

Выше приведен номер числа в строке. Если вы хотите игнорировать регистр:

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

Или, если вы просто хотите считать буквы:

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

Дать ему шанс!

14
MattB

Спасибо, @guffa . Возможность сделать это в одну строку или даже в более длинном выражении в .NET очень удобна. Этот пример VB.NET подсчитывает количество символов LineFeed:

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

j возвращает количество LineFeeds в MyString.

4
Neil Dunlop

Или (в 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

Преобразование кода Уджвала Манандхара в 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())
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

Когда я нашел это решение, я искал что-то немного другое, так как строка, которую я хотел сосчитать, была длиннее одного символа, поэтому я нашел это решение:

    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

Использование кода:

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")
2
Nikos Tziortzios

Я думаю, что это будет проще всего:

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

Использование регулярных выражений ...

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

Я предлагаю вам сделать это так:

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

Вы также можете использовать .Split("e").Count - 1 или .Split("t").Count - 1 соответственно, но это дает неправильные значения, если у вас, например, есть e или t в начале String.

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

Я использую 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');
1
Juan Carlos Velez

Еще одна возможность - работать со Сплитом:

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

Я нашел лучший ответ: P:

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

Использование:

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

Я использовал strin как вариант для обработки очень длинного текста. Разделение может быть на основе нуля или на единицу для нижнего уровня в зависимости от пользовательских настроек, и вычитание обеспечивает правильное количество.

Я не включил тест для strcount длиннее, чем strin, чтобы сохранить краткость кода.

0
Toby Yadon

Я использую следующую функцию. Он не самый эффективный в использовании памяти, но его очень просто понять, он поддерживает несколько методов сравнения, всего 4 строки, быстрый, в основном работает и в VBA, найдет не только отдельные символы, но и любую строку поиска (я часто ищу VbCrLf (ы)).

Отсутствует только возможность начать поиск с другого «Старт»

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

Другая возможность заключается в использовании регулярного выражения:

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.

0
Ujjwal Manandhar

Какие огромные коды для чего-то такого простого:

В 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.

0
Fred

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

0
Timothy Gonzalez