【问题标题】:How to check how many times a string exist in another string如何检查一个字符串在另一个字符串中存在多少次
【发布时间】:2019-08-20 21:47:15
【问题描述】:

我想看看一个字符串在一个字符串中出现了多少次。比如我想看看2018这个段落出现了多少次:

zaeazeaze2018 azeazeazeazeaze2018azezaaze azeaze4azeaze2018

在这种情况下,它发生了 3 次。

我尝试了以下代码

但问题是它总是返回 0

我在这里找不到错误:

public static string count(string k)
{
    int i = 0;
    foreach(var  line in k)
    {
        if (line.ToString().Contains("Bestellung sehen"))
        {
            i++;
            i = +i;
        }

    }
    return i.ToString();
}

【问题讨论】:

  • kchar。调试时可以轻松发现这些错误。请了解如何调试您的程序。
  • 不,我将 K 声明为字符串
  • k 是一个字符串时line 是一个字符,甚至更奇怪。
  • 我认为所有的正则表达式解决方案都错了,一个适当的答案可能应该解释出了什么问题,一个带有循环的解决方案,因此 OP 知道循环解决方案的外观和所涉及的算法,然后一个正则表达式示例。 OP 可能还应该解释,如果这需要区分大小写,以及每行是否会出现不止一次
  • 我的意思是linechar

标签: c#


【解决方案1】:

使用这个:

string text = "Hello2018,world2018\r\nWe have five 2018 here\r\n2018is coming2018"
int Counter = Regex.Matches(text, "2018").Count;
Console.WriteLine(Counter.ToString()); //write : 5

【讨论】:

    【解决方案2】:

    您可以使用Regular Expressions 处理此类情况。正则表达式为您在字符串中的模式匹配提供了很好的灵活性。在您的情况下,我使用正则表达式为您准备了示例代码:

    using System;
    using System.Text.RegularExpressions;
                    
    public class Program
    {
        public static void Main()
        {
            string str="zaeazeaze2018azeazeazeazeaze2018azezaazeazeaze4azeaze2018";
            string regexPattern = @"2018";
            int numberOfOccurence = Regex.Matches(str, regexPattern).Count;
            
            Console.WriteLine(numberOfOccurence);
            
        }
    }
    

    工作示例:https://dotnetfiddle.net/PGgbm8

    如果您注意到string regexPattern = @"2018"; 行,这将设置模式以从您的字符串中查找所有出现的2018。您可以根据需要更改此模式。一个简单的例子是,如果我将模式更改为string regexPattern = @"\d+";,它将给我 4 作为输出。这是因为我的模式将匹配字符串中所有出现的数字。

    【讨论】:

    • 非常感谢您的帮助,先生!
    • @xtool 很高兴为您提供帮助。如果您认为某个答案解决了问题,请单击绿色复选标记将其标记为“已接受”。这有助于将注意力集中在仍然没有答案的旧 SO 上。有关更多信息,请查看我们的 stackoverflow.com/help/accepted-answer
    【解决方案3】:

    这可以使用正则表达式来完成:

    using System.Text.RegularExpressions;
    
    public static int count(string fullString, string searchPattern)
    {
        int i = Regex.Matches(fullString, searchPattern).Count;
        return i;
    }
    

    例如,以下将 2 作为 int 而非字符串返回:

    count("asdfasdfasfdfindmeasdfadfasdasdfasdffindmesadf","findme")
    

    我发现这对于我的大多数用例来说已经足够快了。

    【讨论】:

    • 没有必要使用.Cast<Match>() 来获取LINQ 的Count() 方法,因为MatchCollection 凭借其ICollection 实现已经拥有Count 属性。 .Count() 必须通过强制转换迭代器迭代整个集合。如果不出意外,这是不必要的冗长。但是,如果您将其放大,这将比已经直接使用 Count 属性的其他答案更快地停止“足够快”,尽管实际上,正则表达式匹配可能比迭代花费更大。
    • 好点!我可能骑过 Linq 炒作火车有点太用力了,看过去了。已编辑:)
    【解决方案4】:

    str 是您的 String 来自您的 count 方法 str2 是您的子字符串 Bestellung sehen

    int n = str2.length
    int k = 0;
    for(int i=0;i < str.length; i++){
        if(str.substring(i,i+n-1)){
            k++;
            if(i+n-1 >= str.length){
                break;
            }
        }
    }
    
    return k.toString()
    

    【讨论】:

    • 谢谢,但我不知道为什么我收到一个错误,说 'char' 不包含 indexOf 我认为 Line 在这里是 char 出于某种原因
    • @xtool 我做了更新。检查它你!我希望你能理解这个概念并能够实现它
    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多