使用正则表达式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();
我真的很感激任何线索和帮助。事先非常感谢。
使用
(?<=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();
}
}