Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.
Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.
/([^=,]*)=("[^"]*"|[^,"]*)/
/((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/
key=value,"key with "" in it"="value with "" in it",key=value" "with" "spaces
/([^=,]*)=("(?:\\.|[^"\\]+)*"|[^,"]*)/
key=value,key="value",key="val\"ue"
/((?:\\.|[^=,]+)*)=("(?:\\.|[^"\\]+)*"|(?:\\.|[^,"\\]+)*)/
key=value,key="value",key="val\"ue",ke\,y=val\,ue
Редактирование: добавлены альтернативы экранирования.
Edit2: Добавлена другая альтернативная альтернатива.
очистить ключи / значения, удалив любые escape-символы и окружающие кавычки.
Вот как я мог бы это сделать, если вы можете использовать Perl 5.10
.
qr/ (?<key> (?: [^=,\\] | (?&escape) )++ # Prevent null keys ) \s*+ = \s*+ (?<value> (?"ed) | (?: [^=,\s\\] | (?&escape) )++ # Prevent null value ( use quotes for that ) ) (?(DEFINE) (?<escape>\\.) (?<quoted> " (?: (?&escaped) | [^"\\] )*+ " ) ) /x
Доступ к элементам можно получить через %+
.
perlretut
очень помог в создании этого ответа.
Хороший ответ от MizardX. Незначительные ошибки - это не допускает пробелов вокруг имен и т. Д. (Что может и не иметь значения), и оно собирает кавычки, а также цитированное значение (что также может не иметь значения), и у него нет механизма эвакуации для встраивания двойные кавычки в цитированном значении (что еще раз может не иметь значения).
Как написано, шаблон работает с большинством расширенных систем регулярных выражений. Фиксация обморок, вероятно, потребует спуска, скажем, в Perl. Эта версия использует двойные кавычки для выхода - следовательно, a = «a» «b» генерирует значение поля «a» «b» (что не идеально, но может быть исправлено после этого достаточно легко):
/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/
Кроме того, вам нужно будет использовать $ 2 или $ 3 для сбора значения, тогда как с ответом MizardX вы просто используете $ 2. Таким образом, это не так просто или приятно, но оно охватывает несколько краевых случаев. Если более простой ответ является достаточным, используйте его.
Тестовый скрипт:
#!/bin/perl -w
use strict;
my $qr = qr/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/;
while (<>)
{
while (m/$qr/)
{
print "1= $1, 2 = $2, 3 = $3\n";
$_ =~ s/$qr//;
}
}
Эти witters о том, что либо $ 2, либо $ 3 не определены - точно.