我需要从以下类似的文本中分离出键和值:
学生编号: 0
部门编号 = 18432
姓名 XYZ
Subjects:
Computer Architecture
Advanced Network Security 2
在上面的例子中,学生ID、部门ID和姓名是关键字,0、18432、XYZ是值。关键字与值之间用:、=或多个空格分隔。我尝试使用正则表达式,例如。
$line =~ /(([\w\(\)]*\s)*)([=:\s?]?)\s*(\S.*)?$/;
$key = $2;
$colon=$3;
$value = $4;
我面临的问题是如何识别单个空格和多个空格分隔的单词。
我得到的输出是:行是学生ID:0,键是Student,值是ID:0,而我想要的是键是学生ID,值为0。对于像Subjects: 和Computer Architecture这样的行,键应该有Subjects和Computer Architecture。当没有值或冒号时我将字符串附加到前一个键上,使其看起来像Subjects=Computer Architecture;Advanced Network Security 2。
更新:感谢Ikegami指出我应该使用回顾操作符,但是我仍然似乎无法解决它。
$line=~/^(?: ( [^:=]+ ) (?<!\s\s)\s* [:=]\s*|\s*)(.*)$/x;
当我说
(?<!\s\s)\s* [:=]\s*|\s*
时,我指的是当有两个以上的空格时,消耗所有空格;当没有两个连续的空格时,查找:或=并消耗空格。如果您将以下行传递给表达式,那么$1应该是Name,$2应该是ABC XYZ,对吗?Name ABC XYZ
我看到的是键为空,值为名称 ABC XYZ。