首页 > 解决方案 > 在同一行中提取多个子字符串

问题描述

我正在尝试构建一个日志解析器,但我被卡住了。现在我的程序通过一个目录中的多个文件并逐行读取所有文件。我能够识别我正在寻找的子字符串“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;
    }
    }
}

标签: c#.net

解决方案


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

推荐阅读