Проверьте, сколько раз подстрока появляется в строке

#vb.net

#vb.net

Вопрос:

Мне нужно создать MessageBox, который адаптирован к количеству раз, когда слово появляется в строке. Таким образом, я должен быть в состоянии подсчитать, сколько раз слово появляется в строке. Если это больше, чем 1 раз, появится определенное сообщение. Если это слово встречается только 1 раз, появится другое сообщение. Для ясности мне не нужно знать, сколько раз подстрока встречается в строке. Только если это происходит более одного раза.

Например, у меня есть строка hello hi hello . Я собираюсь проверить слово «привет». Слово встречается несколько раз, поэтому будет отображаться окно сообщения, в котором говорится, что слово появилось несколько раз. Я не знаю, как это сделать, но я думаю, что это будет что-то вроде кода, который я написал ниже?

 Dim stringToCheck, stringToFind As String
stringToCheck = "hello hi hello"
stringToFind = "hello"

If ... Then
   'The stringToFind appeared more than once in stringToCheck
   MessageBox.Show($"The string {stringToFind} was found more then once.", "Found multiple times")
Else
   'The stringToFind appeared only one time in stringToCheck
   MessageBox.Show($"The string {stringToFind} was found one time.", "Found once")
End If
  

Я надеюсь, что кто-нибудь сможет мне помочь. Заранее спасибо!

Комментарии:

1. Если IndexOf и LastIndexOf возвращает одно и то же значение, то существует только один экземпляр.

2. Регулярное выражение. Совпадения . Например., Dim count = Regex.Matches(stringToCheck, stringToFind).Count

3. Если вы решили использовать регулярное выражение, вам нужно быть осторожным, stringToFind если оно содержит специальные символы, которые используются регулярными выражениями. На всякий случай обязательно используйте Regex.Escape(stringToFind) .

4. @jmcilhinney, если только они оба не возвращают -1, и в этом случае экземпляра нет.

5. @Idle_Mind, правильно. Я использовал метод из jmcilhinney, и он отлично работает для меня. В ситуации, когда я использую это для, всегда есть хотя бы один из stringToFind in stringToCheck . Но спасибо за комментарий, потому что я этого не знал! Мой вопрос решен.

Ответ №1:

Есть три возможных результата, которые могут произойти:

  1. Нет вхождений
  2. Одно вхождение
  3. Множественные вхождения

Как было предложено jmcilhinney, вы можете использовать indexOf и lastIndexOf, чтобы помочь вам сделать это определение.

Если строка не найдена, то будет возвращено значение -1. Если строка присутствует (-1 не возвращается), но встречается только один раз, то два значения будут одинаковыми. Если два значения не равны -1 и отличаются, то присутствуют множественные вхождения.

Вот простой If...Else блок, который показывает, что проверяются все три состояния:

 Dim stringToCheck, stringToFind As String
stringToCheck = "hello hi hello"
stringToFind = "hello"

Dim index1, index2 As Integer
index1 = stringToCheck.IndexOf(stringToFind)
If index1 <> -1 Then
    index2 = stringToCheck.LastIndexOf(stringToFind)
End If

If index1 = -1 Then
    MessageBox.Show($"The string {stringToFind} was NOT found.", "No occurrences")
ElseIf index1 = index2 Then
    MessageBox.Show($"The string {stringToFind} was found ONCE.", "One occurrence")
Else
    MessageBox.Show($"The string {stringToFind} was found MULTIPLE TIMES.", "Multiple occurrences")
End If
  

Комментарии:

1.Небольшим улучшением было бы проверять LastIndexOf() только if IndexOf() returns >=0 .