操纵字符串,搜索文本

时间:2010-06-04 14:50:50

标签: c# search string

注1:我只有字符串,而不是文件,只有字符串。

我有一个这样的字符串(注意:为了清楚起见,我将包括行号)

行分隔符为\r\n(CRLF)

string allText = 

1 Lorem ipsum Lorem ipsum

2 == START 001partXXX.sql ==

3 Lorem ipsum TEXT Lorem ipsum

4 == END 001partXXX.sql ==

5 Lorem ipsum TEXT Lorem ipsum

6 == START 002partzzz.sql ==

7 Lorem ipsum TEXT Lorem ipsum

8 == END 002partzzz.sql ==

我有contents这样的字符串:

string contents1 =
== START 001partXXX.sql ==

Lorem ipsum TEXT Lorem ipsum

== END 001partXXX.sql ==

另一个contents字符串:

string contents2 =

== START 002partzzz.sql ==

Lorem ipsum TEXT Lorem ipsum

== END 002partzzz.sql ==

然后,

allText.IndexOf(contents1) != -1

allText.IndexOf(contents2) != -1

我需要一个接收3个参数的函数:allTextContentstext,以便在contents中找到,并返回Text的行号在AllText找到。

例如,

  

输入:allText,contents2,“TEXT”

     

ouput =第7行

另一个样本,

  

输入:allText,contents1,“TEXT”

     

ouput =第3行

另一个样本,

  

输入:allText,contents1,“TEXT NOT FOUND”

     

ouput =行号-1

如何实现此功能?

提前致谢。

1 个答案:

答案 0 :(得分:1)

你的问题很混乱,但我认为我得到了它的要点。我会编辑这个问题,但我没有代表这样做。

总结一下,你有一个包含多个文件内容的字符串。您想知道较大主文件中某个文件的特定文本位的索引。

当找不到文本时,这将返回-1。我还假设你的字符串中的行由平台默认值(Windows上的\ r \ n)分隔。

希望这能回答你的问题。

using System;
using System.Collections.Generic;
using System.IO;

public class MyClass
{
    public static void Main()
    {
        //read relevant text from disk
        string AllText = File.ReadAllText(@"c:\alltext.txt"); 
        string Contents = File.ReadAllText(@"c:\contents.txt");
        string text = "TEXT";

        int line = SearchForLine(AllText, Contents, text);

        Console.WriteLine(line);
        Console.Write("Press any key to continue...");
        Console.ReadKey();
    }

    static int SearchForLine(string AllText, string Contents, string SearchText)
    {
        //split strings into arrays based on newline character 
        //uses environment.newline (\r\n on windows). change to what you 
        //need if this isn't correct
        string[] AllTextSplit = SplitStringOnNewLine(AllText);
        string[] ContentsSplit = SplitStringOnNewLine(Contents);

        //find the first line of Contents in AllText 
        int start = FindIndex(AllTextSplit, ContentsSplit[0]);
        //find the last line of Contents in AllText 
        int stop = FindIndex(AllTextSplit, ContentsSplit[ContentsSplit.Length - 1]);

        //search alltext for SearchText between start and stop (lines where contents exist in AllText
        for (int i = start; i <= stop; i++)
        {
            if (AllTextSplit[i].IndexOf(SearchText)!=-1)
            {
                return i + 1; // + 1 because you want line numbers starting at 1   
            }
        }
       return -1; 
    }

    private static int FindIndex(string[] TextToSearch, string SearchText)
    {
        for (int i = 0; i < TextToSearch.Length; i++)
        {
            if (TextToSearch[i] == SearchText)
            {
                return i;
            }
        }
        return -1;
    }
    private static string[] SplitStringOnNewLine(string StringToSplit)
    {
        return StringToSplit.Split(new string[] { Environment.NewLine },
                       StringSplitOptions.None);
    }
}