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

sha*_*aun 6 regex perl parsing

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

key1=value1 key2=value2 
Run Code Online (Sandbox Code Playgroud)

总共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
Run Code Online (Sandbox Code Playgroud)

这只是"壁纸"和"Folder.ico"之间有空格的一个例子.有没有办法设计一个可以解释它的正则表达式并拆分所有这些键值对?如果没有正则表达方式,你能否建议我处理它?

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

Mar*_*der 10

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

$input =~ s/[ ](?!\S+=)/_/g;
Run Code Online (Sandbox Code Playgroud)

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

然后你可以拆分空格.

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

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

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

工作演示.

如果您的密钥总是大写,您可以\S+在我的代码中替换所有密钥[A-Z]+.