在C#中查找匹配的单词

时间:2012-06-28 11:01:48

标签: c# .net string for-loop

我正面临解决此问题的问题。我有一个字符串变量,例如

              string text="ABCD,ABCDABCD,ADCDS";

我需要在上面的字符串中搜索像'BC'这样的字符串值,并找到“BC”出现的位置。即如果我们将“BC”搜索到该字符串变量,它将输出为1,6

              0   1   2   3  4    5   6   7   8   9   10  11 12   13
            -------------------------------------------------------
            | A | B | C | D | , | A | B | C | D | , | A | D | C | S |
            -------------------------------------------------------

问题是我们无法使用内置的字符串类方法contains()lastIndexOf()。任何人都可以帮我这样做吗?

6 个答案:

答案 0 :(得分:1)

  

问题是我们无法使用内置的字符串类方法   '包含()', 'lastIndexOf()'。任何人都可以帮我这样做吗?

然后你可以建立自己的。我认为即使是Substring也是禁止的。

string text="ABCD,ABCDABCD,ADCDS";
string whatToFind = "BC";

List<int> result = new List<int>();
for(int index=0; index < text.Length; index++)
{
    if(index + whatToFind.Length > text.Length)
        break;
    bool matches = true;
    for(int index2=0; index2<whatToFind.Length; index2++)
    {
        matches = text[index+index2] == whatToFind[index2];
        if(!matches)
            break;
    }
    if(matches)
        result.Add(index);
}

以下是正在运行的代码:http://ideone.com/s7ej3

答案 1 :(得分:0)

这应该适合你:

string text="ABCD,ABCDABCD,ADCDS";
var seekindex = 0;
var positions = new List<int>();
while( seekindex < text.Length ){
  var index = text.IndexOf( "BC", seekindex);
  if( index > -1){
    positions.Add(index);
    seekindex = index + 1;
  }else{
    break;
  }
}

这会将IndexOf方法与startindex一起使用,以确保我们下次继续从之前的匹配位置搜索,直到IndexOf返回-1表示没有更多匹配。

positions将包含最后的索引,结果实际上是1,6,10而不是1,6;)

修改

刚才意识到他无法使用IndexOf。再试一次:)

string text="ABCD,ABCDABCD,ADCDS";
var positions = new List<int>();
for( int i = 0; i < text.Length-1; i++ ){
  if( text[i] == 'B' && text[i+1] == 'C' ){
    positions.Add(i);
  }
}

这似乎是一个性能问题,因为if句子检查当前和下一个字符,因此检查所有字符两次。

但事实上它不会。由于AND(&amp;&amp;)介于两者之间,如果text[i]不是B,它将不会执行第二次检查,因为它知道if无论如何都会失败。

答案 2 :(得分:0)

string text = "ABCD,ABCDABCD,ADCDS";
            int location;
            for (int i = 0; i < text.Length; i++)
                if (text[i] == 'B')
                    if (text[i + 1] == 'C')
                    {
                        location = i;
                        i++;
                    }

修改

List<int> locations = new List<int>();
string text = "ABCD,ABCDABCD,ADCDS";
                for (int i = 0; i < text.Length; i++)
                    if (text[i] == 'B')
                        if (text[i + 1] == 'C')
                        {
                            location.Add(i);
                            i++;
                        }

答案 3 :(得分:0)

可能你不能在作业中使用正则表达式。最好的解决方案是将您的字符串视为char数组。阅读http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm

答案 4 :(得分:0)

滚动你自己版本的IndexOf并不难(根据你已经收到的答案),而且由于它是家庭作业,你可能会侥幸逃脱。

但是,正如您可能想象的那样,简单的for循环不是最有效的方法。字符串搜索是一个重要的主题,虽然您可能不需要再次在作业之外实现它,但您可以read about it进行自己的启发。

答案 5 :(得分:0)

以下是满足您要求的完美工作示例,但也很好而且速度慢且占用内存很大:

string text = "ABCD,ABCDABCD,ADCDS";
string whatToFind = "BC";

string delim = "";    

for(int index=0; index < text.Length; index++)
{
    if(index + whatToFind.Length > text.Length)
        break;

    if(text.SubString(index, whatToFind.Length) == whatToFind)
    {
        Console.Out.WriteLine(delim + index.ToString())
        delim = ",";
    }
}

我将它留给读者作为练习来提高性能和内存使用率。了解这个问题的地点和原因比获得更快的答案更有用。