【问题标题】:manipulating strings, search text操作字符串,搜索文本
【发布时间】:2010-06-04 14:50:49
【问题描述】:

注意 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个参数的函数:allTextContentstextcontents中查找,并返回Text的行号在AllText中查找。

例如,

输入:allText, contents2, "TEXT"

输出 = 行号 7

另一个样本,

输入:allText, contents1, "TEXT"

输出 = 行号 3

另一个样本,

输入:allText, contents1, "TEXT NOT FOUND"

输出 = 行号 -1

如何实现这个功能?

提前致谢。

【问题讨论】:

  • 找不到 TextToFind 时会发生什么?另外,你的线,它们是如何分开的? \r、\r\n 还是 \n?
  • 我只是将文件用作为传递给函数的字符串播种的一种方式。该函数本身只处理字符串。

标签: c# search string


【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多