从字符串中提取子字符串

时间:2012-10-16 08:48:48

标签: regex string parsing text-files

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

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

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

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

输入后面只有一条规则:配置名称后跟=后跟值

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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";
    }
}

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