簡體   English   中英

如何在 c# 的字符串中查找特定字符串的數量

[英]How to find number of specific strings in a string in c#

有一個字符串:xxoxoxoxoxoxooxxxxox 其中 x 是一個被占用的座位而 o 沒有,我必須找到個人占用的座位,兩邊都有一個 x。

我試着看看

for (int i = 0; i < string.Length; i++) { 
    if(string[i]=='x' && string[i + 1]=='o' && string[i + 2] == 'x') 
      { 
        count++; 
      } 
}

但我得到了錯誤,所以我想知道是否有好的方法來做到這一點。

由於問題很不清楚,我假設您正在尋找模式xox並想知道o的 position 。

您可以運行 for 循環並獲取索引。

獲取此類模式的數量。 您可以將計數增加 1。

string str = "xxoxoxoxoxoxooxxxxox";

for(int i = 0; i < str.Length - 2; i++)
{
    if (str[i] == 'x' && str[i +1] == 'o' && str[i+ 2] == 'x')
    {
        Console.WriteLine(i + 1);
        count++; 
    }
}

您可以根據需要更改字符值。

RegEx 方法為您提供個人占用席位的所有索引oxo https://do.netfiddle.net/3jc1Vq

string input = "xxoxoxoxoxoxooxxxxox";
//                ^ ^ ^ ^ ^       ^
int[] indices = Regex.Matches(input, "(?<=x)o(?=x)").Cast<Match>().Select(x => x.Index).ToArray();

// in case you only want the count
int count = Regex.Matches(input, "(?<=x)o(?=x)").Count(); 

您可以使用regex.matches查找所有匹配項...

        string s = "xxoxoxoxoxoxooxxxxox";
        Regex rx = new Regex("xox");
        foreach (Match match in rx.Matches(s))
        {
           Console.WriteLine("Match index: "+ match.Index);
        }

在此處輸入圖像描述

我制作了一個使用ReadOnlySpan<T>並避免 RegEx 和過度分配的工作示例

using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        string seats = "xxoxoxoxoxoxooxxxxox";
        var results = seats.ToCharArray().GetSingles('o');
        foreach(var i in results)
        {
            Console.WriteLine(i);
        }
    }
}
                                   
public static class Ext
{
    public static IReadOnlyList<int> GetSingles<T>(this T[] source, T search)
    {
        var results = new List<int>();
        if(source.Length == 0)
        {
            return results;
        }
        
        if (source.Length == 1)
        {
            if (source[0].Equals(search))
            {
                results.Add(0);
            }
            
            return results;
        }
        
        if(source.Length >= 2)
        {
            if (source[0].Equals(search) && ! source[1].Equals(search))
            {
                results.Add(0);
            }
            
            if (source.Length == 2)
            {
                if (!source[0].Equals(search) && source[1].Equals(search))
                {
                    results.Add(1);
                }
                
                return results;
            }
        }
        
        ReadOnlySpan<T> window = new ReadOnlySpan<T>(source, 0, 3);
        int i = 1;
        for(; i < source.Length - 1; i++)
        {
            window = new ReadOnlySpan<T>(source, i - 1, 3);
            if(!window[0].Equals(search) && 
                window[1].Equals(search) &&
               !window[2].Equals(search))
            {
                results.Add(i);
            }
        }
        
        if(!window[1].Equals(search) && window[2].Equals(search))
        {
            results.Add(i + 1);
        }
        
        return results;
    }
}

這輸出,

2
4
6
8
10
18

隨着更具挑戰性的測試數據,

public class Program
{
    public static void Main()
    {
        var tests = new string[]
        {
            "",
            "o",
            "x",
            "oo",
            "ox",
            "xo",
            "xx",
            "oxx",
            "oox",
            "xox",
            "xoo",
            "xoxoxoxo",
            "xoxoxoxoo",
            "xoxoxox"
        };
        
        for(var i = 0; i < tests.Length; i++)
        {
            string seats = tests[i];
            Console.WriteLine($"{i}:\"{seats}\"");
            var results = seats.ToCharArray().GetSingles('o');
            foreach(var r in results)
            {
                Console.WriteLine(r);
            }
        }
    }
}

我們得到正確的 output

0:""
1:"o"
0
2:"x"
3:"oo"
4:"ox"
0
5:"xo"
1
6:"xx"
7:"oxx"
0
8:"oox"
9:"xox"
1
10:"xoo"
11:"xoxoxoxo"
1
3
5
8
12:"xoxoxoxoo"
1
3
5
13:"xoxoxox"
1
3
5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM