当值也可以包含空格时,拆分包含以空格分隔的“key = value”对的字符串

时间:2013-07-02 13:06:25

标签: regex perl parsing

我正在处理记录的服务器之间的文件传输。这些最终必须上传到数据库,所以我正在预处理它们以检查错误。每个日志文件条目代表一个传输,它们的格式为:

key1=value1 key2=value2 

共有16个字段。大多数传输都很好,除非有人传输名称中包含空格的文件。这会让我的处理变得混乱,因为我只是在perl脚本中调用了空格分割。例如:

DATE=20130411140806.384553 HOST=somehost PROG=someserver NL.EVNT=FTP_INFO START=20130411140806.384109 USER=someuser FILE=/extended_path/Wallpapers Folder.ico BUFFER=98720 BLOCK=262144 NBYTES=0 VOLUME=/ STREAMS=2 STRIPES=1 DEST=[0.0.0.0] TYPE=STOR CODE=226

这只是“壁纸”和“Folder.ico”之间有空格的一个例子。有没有办法设计一个可以解释它的正则表达式并拆分所有这些键值对?如果没有正则表达方式,你能否建议我采用其他任何方式来处理它?<​​/ p>

我的目标是用什么都没有替换那些空格(即删除空格)或下划线,这样当我运行脚本加载到数据库中时,在单个空格上拆分就不会有问题了。我正在使用perl来完成所有这些。

1 个答案:

答案 0 :(得分:9)

您可以使用lookahead搜索不需要的空格,以确保它们不会出现密钥:

$input =~ s/[ ](?!\S+=)/_/g;

前瞻确保在下一个空格字符前没有=

然后你可以拆分空格。

或者,要立即匹配,您可以使用类似的技术:

while ($input =~ m/(\S+)=((?:\S|[ ](?!\S+=))+)/g)
{
    # $1 is the key
    # $2 is the value
}

对于值,我们重复非空格字符或不添加键的空格。

Working demo.

如果您的密钥始终为大写,则可以使用\S+替换我代码中的所有[A-Z]+