Мне нужно отделить ключ и значения от текста, который выглядит ниже
Идентификатор студента: 0
Идентификатор факультета = 18432
Имя XYZ
Subjects:
Computer Architecture
Advanced Network Security 2
В приведенном выше примере идентификатор студента, идентификатор отдела и имя являются ключами, а 0,18432, XYZ являются значениями. Ключи отделяются от значений либо знаком :,=, либо несколькими пробелами. Я пробовал reg ex, например
$line =~ /(([\w\(\)]*\s)*)([=:\s?]?)\s*(\S.*)?$/;
$key = $2;
$colon=$3;
$value = $4;
Проблема, с которой я сталкиваюсь, заключается в том, чтобы определить, когда слово разделено одним пробелом, а когда оно разделено более чем одним.
Вывод, который я получаю, представляет собой строку «Идентификатор студента: 0», ключ «Студент», значение — «Идентификатор: 0», в то время как я хочу, чтобы ключ — «Идентификатор студента», а значение — 0. Для таких строк, как «Предметы:» и «Архитектура компьютера», ключ должен иметь «Предметы» и «Архитектура компьютера». У меня есть логика позже, когда нет значения или двоеточия, я добавляю строки к предыдущему ключу, чтобы он выглядел как Subjects=Computer Architecture;Advanced Network Security 2
Обновление: спасибо, Икегами, за то, что указал, что я использую оператор просмотра. Но у меня все еще есть проблема с ее решением.
$line=~/^(?: ( [^:=]+ ) (?<!\s\s)\s* [:=]\s*|\s*)(.*)$/x;
Поэтому, когда я говорю (?<!\s\s)\s* [:=]\s*|\s*
, я имею в виду, что когда пробелов больше двух, используйте все пробелы, а когда нет двух последовательных пробелов, ищите: или = и используйте пробелы. Итак, если вы передадите строку ниже в выражение, разве я не должен получить $1 = Name и $ 2 = ABC XYZ?
Name ABC XYZ
То, что я, кажется, получаю, это то, что ключ пуст, а значение - Name ABC XYZ.