2010-06-04 74 views
0

我嘗試解釋我的問題:操縱字符串,搜索文本

注意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 == 

我有內容的字符串是這樣的:

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

Lorem ipsum TEXT Lorem ipsum 

== END 001partXXX.sql == 

其他內容字符串:

string contents2 = 

== START 002partzzz.sql == 

Lorem ipsum TEXT Lorem ipsum 

== END 002partzzz.sql == 

然後,

allText.IndexOf(contents1)= -1

allText.IndexOf(contents2)= -1

我需要的功能,多數民衆贊成接受3個參數:allText,內容和文本找到的內容,並返回文本的行號要allText

例如查找,

輸入:allText,contents2,「TEXT 「

輸出中=行數7

另一個樣品,

輸入:allText,contents1, 」TEXT「

輸出中=行數3

另一個樣品,

輸入:allText,contents1, 「TEXT NOT FOUND」

輸出中=行數-1

我怎樣才能實現這個功能?任何幫助對我非常有用,

感謝先進。

+0

當找不到TextToFind時會發生什麼?另外,你的線條,它們是如何分開的? \ r,\ r \ n或\ n? – 2010-06-04 15:15:54

+0

我只使用這些文件作爲傳遞給函數的字符串的種子。該函數本身只處理字符串。 – 2010-06-07 12:53:57

回答

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); 
    } 
}