繁体   English   中英

从字符串中提取子字符串

[英]Extract substring from string

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

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

但是该文件可能还包含分隔符,例如,或其他任何东西:

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

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

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

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

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

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

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

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

这是一个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";
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM