使用正则表达式C#在两个字符串的块中获取文本文件的多行字符串

本文关键字:字符串 获取 取文本 文件 两个 正则表达式 | 更新日期: 2023-09-27 18:00:57

我有一个文本文件,其内容如下:

   initTest   
1234 567 8910
1234 567 8910
   endTest   
   initTest   
1234 567 8911
1234 567 8911
   endTest   
   initTest   
1234 567 8912
1234 567 8912
   endTest   

然后我需要得到"initTest"(单词前后有3个空格(和"endTest"(词前后有3个子空格(中的块的数量,并将块的元素保存到数组X中。结果应该是,X[0]={"1234 567 8910''n 1234 567 89010"}并且X.长度=3。

我尝试过使用Regex在C#中执行以下代码,但结果不匹配。

string text = line;
string search = @"(^'s*initTest.*?^'s*endTest)";
MatchCollection matches = Regex.Matches(text, search, RegexOptions.Singleline | RegexOptions.IgnoreCase);
Console.WriteLine("there was {0} matches for '{1}'", matches.Count, search);
Console.ReadLine();

我真的很感激任何线索和帮助。事先非常感谢。

使用正则表达式C#在两个字符串的块中获取文本文件的多行字符串

使用

(?<=initTest)(.|'n)*?(?=endTest)

其中

initTest(.|'n)*?endTest

将捕获所需的文本,但包括initTest和endTest。使用(?<=…(和(?=…(将有助于消除它们。

演示:https://dotnetfiddle.net/tiXRut

试试这个正则表达式:

var text = @"
   initTest   
1234 567 8910
1234 567 8910
   endTest   
   initTest   
1234 567 8911
1234 567 8911
   endTest   
   initTest   
1234 567 8912
1234 567 8912
   endTest   
";
var pattern = string.Join(@"'s+", 
    @"'s+initTest",
    @"(?<sequence1>'d{4} 'd{3} 'd{4})",
    @"(?<sequence2>'d{4} 'd{3} 'd{4})",
    @"endTest");
var matches = Regex.Matches(text, pattern, RegexOptions.Multiline)
    .Cast<Match>()
    .Select(x => new
    {
        Content = x.Value,
        Sequence1 = x.Groups["sequence1"].Value,
        Sequence2 = x.Groups["sequence1"].Value,
    });
void Main()
{
    string search = @"(?<=initTest)(.|'n)*?(?=endTest)";
    string text = GetData();
    MatchCollection matches = Regex.Matches(text, search, RegexOptions.Singleline | RegexOptions.IgnoreCase);
    Console.WriteLine("there were {0} matches for '{1}'", matches.Count, search);
    for(int i=0; i < matches.Count; i++)
        Console.WriteLine(matches[i].Groups[0].ToString());
    Console.ReadLine();
}
public string GetData()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("   initTest");
    sb.AppendLine("1234 567 8910");
    sb.AppendLine("1234 567 8910");
    sb.AppendLine("   endTest");
    sb.AppendLine("   initTest");
    sb.AppendLine("1234 567 8911");
    sb.AppendLine("1234 567 8911");
    sb.AppendLine("   endTest");
    sb.AppendLine(" ");
    sb.AppendLine("   initTest");
    sb.AppendLine("1234 567 8912");
    sb.AppendLine("1234 567 8912");
    sb.AppendLine("   endTest");
    return sb.ToString();   
}

如果你喜欢在没有正则表达式的情况下进行,你可以尝试这个解决方案:

class Program
{
    static void Main(string[] args)
    {
        string path = @"C:'Projects'StackOverRegX'StackOverRegX'input.txt";
        string[] x = new string[100];
        int index = 0;
        if (File.Exists(path))
        {
            using (StreamReader sr = File.OpenText(path))
            {
                string s = "";
                while ((s = sr.ReadLine()) != null)
                {
                    if(s.Contains("initTest"))
                    {
                        x[index] = sr.ReadLine() + " 'n " + sr.ReadLine();
                        index++;
                    }
                }
            }
        }
        for (int i = 0; i < 100; i++)
        {
            if(x[i]!=null)
            Console.WriteLine(x[i]);
        }
        Console.ReadKey();
    }
}