模式匹配文本并在C ++中提取数据

问题描述 投票:0回答:1

我试图弄清楚如何从文本文件中提取文本,如果它与第二个文本文件具有相同的模式,并将提取的值放入另一个文本文件中。我以前从未做过这样的事情,所以我什至不知道从哪里开始。

例如,在文件1中,我们可能会有类似的内容:

else
        {
            if (func_133212(13))
            {
                if (unk_0x44334545("test"))
                {
                    if (!0x22224334545("test"))
                    {
                        0x44444237945("test", true);
                    }
                }
                if (Global_2398334.f_502.f_11 >= 2)
                {
                    if (unk_0x44334545("test2"))
                    {
                        if (!0x22224334545("test2"))
                        {
                            0x44444237945("test2", true);
                        }
                    }
                }
}

然后在文件2中,我们有类似的内容:

else
        {
            if (func_12312(13))
            {
                if (unk_0x433877545("test"))
                {
                    if (!unk_0x3434344("test"))
                    {
                        unk_0x42224442111("test", true);
                    }
                }
                if (Global_23445454.f_502.f_11 >= 2)
                {
                    if (unk_0x433877545("test2"))
                    {
                        if (!unk_0x3434344("test2"))
                        {
                            unk_0x42224442111("test2", true);
                        }
                    }
                }
}

程序将识别出它们具有相同的模式,并将unk_提取到列表中,左侧文件1中的unk_和右侧文件2中的unk_像这样:

unk_0x44334545,unk_0x433877545

等等

我知道这非常复杂,因此我们非常感谢您的帮助,如果您需要更多信息或类似信息,请告诉我。只是试图了解如何执行此操作。

谢谢:)

c++ find pattern-matching
1个回答
0
投票

您如何定义“相同模式”。例如,空格重要吗?您想针对任何一种语言还是仅针对一种语言进行此操作?

一种特定语言的一种快速算法可能是:

  1. 将每个文件作为单个字符串加载到内存中。
  2. 将这些字符串标记在特殊的分隔符上(例如:{}()> = .;),但是将这些标记保留在序列中。这会将您的输入字符串转换为令牌列表。
  3. 修剪空白的所有标记。这使您可以忽略空格差异。例如,您的目标是从第一个文件中获得如下序列:else, {, if, (, func_133212, (, 13, ), ...
  4. 现在您可以线性比较两个列表,并且可以输出不匹配的对。您还可以添加一些逻辑来表示,要输出一对,您需要在元素之前和之后都进行匹配-因此,两个连续的不匹配将停止您的比较。

类似的方法适用于您显示的示例,也可以进行调整以适用于更复杂的示例。另外,如果您需要处理较大的文件,则可以流式传输它们的内容并逐步进行比较,但这需要更多的编码。

© www.soinside.com 2019 - 2024. All rights reserved.