0

我需要分析一个文本文件。该文件包含一些配置信息。数据保存如下(一般示例):

size=12age=2speed=33id=93539841277312987

但该文件也可能包含分隔符,或其他任何内容:

size = 12 , age = 2 , speed = 33 , id = P93AR9841277312987

输入遵循的规则只有一个:配置名称后跟=值后跟

我所拥有的:输入文件中可能出现的所有配置名称,保存在字典中

我想要什么:将输入文件中的值保存到字典中的适当键([Size,12][age,2]...)。我很难提取一个和以下配置名称之间的值。

到目前为止我所做的:找到配置名称的结束索引作为我想要的字符串的开始索引。但是很难确定下一个配置名称从哪里开始。此外,还应处理配置名称列表的末尾(因为没有以下配置名称可供参考)。一种想法是搜索文本文件中的所有配置名称,并选择最小但仍大于当前配置名称结束索引的结束索引的开始索引。但我认为有一个更简单的方法。

4

2 回答 2

0

我想出了这个正则表达式,但它在值中包含分隔符。每个匹配返回两个捕获组,键和值:

(size|age|speed|id)\s*=\s*(.+?)(?=\s|size|age|speed|id|$)

您可以修改它以添加所有配置名称。您还可以修改前瞻以包含您的分隔符,在这种情况下,它不会在值中包含您的分隔符。这是测试

于 2012-10-16T08:58:55.403 回答
0

这是一个 Perl 解决方案,它可能是给定文本文件规范的最佳解决方案:

my @keys = ('foo','bar','2baz','bla');
my $data = "spoofoo=123  , bar= 12baz = blah";

foreach my $key (@keys)
{
    if ($data =~ /\Q$key\E\s*=\s*([\w\d]+)/) 
    {
        my $val = $1;
        foreach my $key2 (@keys)
        {
           if ($val =~ /(.*)\Q$key2\E$/)
           {
               $val = $1;
               last;
           }
        }
        print "$key value is $val\n";
    }
    else
    {
        print "$key not found\n";
    }
}

这会找到字典中每个键后面的值。然后它检查它找到的值以查看该值的结尾是否实际上是另一个键的开头。但是,可能会出现根本无法解决的情况,具体取决于您的键集和潜在值。

于 2012-10-16T09:13:06.167 回答