我需要将键和值与如下所示的文本分开
学生 ID:0
部门 ID = 18432
姓名 XYZ
Subjects:
Computer Architecture
Advanced Network Security 2
在上面的示例中,Student ID、Department ID 和 Name 是键,0,18432、XYZ 是值。键与值通过 :,= 或多个空格分隔。我尝试了reg ex,例如
$line =~ /(([\w\(\)]*\s)*)([=:\s?]?)\s*(\S.*)?$/;
$key = $2;
$colon=$3;
$value = $4;
我面临的问题是确定一个单词何时用单个空格分隔以及何时被多个空格分隔。
我得到的输出是 line is Student ID: 0 key is Student , value is ID: 0 而我想要 key is Student ID 并且 value 是 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。