子串,正则表达式或其他从字符串中获取特定数据的方法

时间:2015-10-07 11:42:02

标签: regex perl substring

我有以下内容的变量$ conf(从带有unix编码换行符的文件加载):

db_host='127.0.0.1'
db_user='mail_channels'
db_name='mail_channels'
db_pass='kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'

我希望获得db_host,db_user等的值。分配给变量$ dbHost,$ dbUser等。我该怎么做?

注意:我无法逐行读取文件。 $ conf变量的内容是我从请求获得的数据(我必须修改用Perl编写的API)。

1 个答案:

答案 0 :(得分:3)

像这样:

 my %conf = $conf =~ m/^(\w+)=\'(.*)\'/gm;

E.g:

#!/usr/bin/env perl
use strict;
use warnings;

use Data::Dumper;

my $conf = q{ 
    db_host='127.0.0.1'
    db_user='mail_channels'
    db_name='mail_channels'
    db_pass='kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD' 
};

print $conf;

print "\n---\n";

my %conf = $conf =~ m/^(\w+)=\'(.*)\'/gm;
print Dumper \%conf;

这会给你:

$VAR1 = {
          'db_user' => 'mail_channels',
          'db_name' => 'mail_channels',
          'db_host' => '127.0.0.1',
          'db_pass' => 'kWaNqEvnTCOUnpMI09NljSBXvXCm5DeD'
        };

它有效,因为 - 正则表达式上的g重复,m执行多行。

使用两个捕获组,我们可以获取配对值(键/值),当我们将其分配到%conf哈希时,它会将它们视为键值对。

打破正则表达式:

my %conf = $conf =~ m/
                        ^                 #start of line anchor
                        (\w+)             #word characters, one more
                         =                #just a literal equals
                         \'(.*)\'         #a quote either side of value
                     /gmx;                #x allows whitespace in the regex

对于第二组,它将删除字符串中的引号。如果你需要保留它们,你可以改为:

my %conf = $conf =~ m/^(\w+)=(.*)/gm;