c# - 在同一行中提取多个子字符串
问题描述
我正在尝试构建一个日志解析器,但我被卡住了。现在我的程序通过一个目录中的多个文件并逐行读取所有文件。我能够识别我正在寻找的子字符串“fct=”并使用分隔符提取“=”旁边的值,但我注意到当我有一行包含多个“fct=”时,它看不到它。
所以我重新启动我的代码,我找到了一种方法来获取 fct= 在同一行中所有出现的索引位置,使用扩展方法将索引放入列表中,但我不知道如何使用这个列表来获取值在“=”旁边并使用我的分隔符。
知道“fct=”的起始位置和所需值末尾的分隔符,我如何提取“=”旁边的值?
我从 C# 开始,所以如果我可以给你更多信息,请告诉我。谢谢,
这是我要解析的示例:
<dat>FCT=10019,XN=KEY,CN=ROHWEPJQSKAUMDUC FCT=666</dat></logurl>
<dat>XN=KEY,CN=RTU FCT=4515</dat></logurl>
<dat>XN=KEY,CN=RT</dat></logurl>
我想检索 10019,666 和 4515。
namespace LogParserV1
{
class Program
{
static void Main(string[] args)
{
int counter = 0;
string[] dirs = Directory.GetFiles(@"C:/LogParser/LogParserV1", "*.txt");
string fctnumber;
char[] enddelimiter = { '<', ',', '&', ':', ' ', '\\', '\'' };
foreach (string fileName in dirs)
{
StreamReader sr = new StreamReader(fileName);
{
String lineRead;
while ((lineRead = sr.ReadLine()) != null)
{
if (lineRead.Contains("fct="))
{
List<int> list = MyExtensions.GetPositions(lineRead, "fct");
//int start = lineRead.IndexOf("fct=") + 4;
// int end = lineRead.IndexOfAny(enddelimiter, start);
//string result = lineRead.Substring(start, end - start);
fctnumber = result;
//System.Console.WriteLine(fctnumber);
list.ForEach(Console.WriteLine);
}
// affiche tout les ligne System.Console.WriteLine(lineRead);
counter++;
}
System.Console.WriteLine(fileName);
sr.Close();
}
}
// Suspend the screen.
System.Console.ReadLine();
}
}
}
namespace ExtensionMethods
{
public class MyExtensions
{
public static List<int> GetPositions(string source, string searchString)
{
List<int> ret = new List<int>();
int len = searchString.Length;
int start = -len;
while (true)
{
start = source.IndexOf(searchString, start + len);
if (start == -1)
{
break;
}
else
{
ret.Add(start);
}
}
return ret;
}
}
}
解决方案
Regex
您可以通过使用模式匹配来大大简化您的代码。
以下模式:(?<=FCT=)[0-9]*
将匹配任何以 . 开头的数字组FCT=
。
这使我们能够执行以下操作:
string input = "<dat>FCT=10019,XN=KEY,CN=ROHWEPJQSKAUMDUC FCT=666</dat></logurl>...";
string pattern = "(?<=FCT=)[0-9]*";
var values = Regex.Matches(input, pattern).Cast<Match>().Select(x => x.Value);
推荐阅读
- python - Python pandas to read an Excel file with more than one row headers
- r - 是否有用于检查向量中的成员资格的 R 函数?
- sas - SAS 冒号格式修饰符
- matlab - 矢量化八度
- laravel - 我在 Ubuntu 20.04 上收到“laravel:找不到命令”
- r - Zoo 包中的 R as.yearqtr:如何删除空白
- c# - 如何为 ASP.Net 身份用户模型创建关系(一对一、多对多)
- forms - 表单帮助 - 从具有组合框或文本框值的表中获取要填充的字段
- php - 没有从下拉 PHP 中获得所需的值
- python - Python:嵌套for循环