Регулярное выражение для анализа пар "имя-значение"

Хороший ответ от MizardX. Мелкие perl-regex придирки - он не допускает regular-expression пробелов вокруг имен и т. д. (что perlre может не иметь значения), и regular-expression он собирает кавычки, а также perlre значение в кавычках (что regexes также может не иметь значения), и perlre у него нет механизма выхода regex для встраивания двойные кавычки regular-expressions в цитируемом значении (что, опять regularexpression же, может не иметь значения).

Как regex написано, шаблон работает regular-expression с большинством расширенных regular-expressions систем регулярных выражений. Исправление apache-regexp недочетов, вероятно, потребует perlre погружения, скажем, в Perl. В regex этой версии для экранирования regexes используются двойные кавычки, поэтому regex-php a="a""b" генерирует значение regex поля 'a""b' (которое не идеально, но regular-expression впоследствии может быть легко perlre исправлено):

/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/

Кроме того, вам regex-php нужно будет использовать apache-regexp 2 или 3 доллара для получения apache-regexp значения, тогда как с ответом regexp MizardX вы просто используете regexp 2 доллара. Таким образом, это regularexpression не так просто или приятно, но regexes охватывает несколько крайних regexp случаев. Если более простой regex-php ответ подходит, используйте apache-regexp его.

Тестовый сценарий:

#!/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//;
    }
}

Это regex говорит о том, что либо $2, либо apache-regexp $3 не определены - точно.

regex

2022-07-10T18:40:45+00:00
Вопросы с похожей тематикой, как у вопроса:

Регулярное выражение для анализа пар "имя-значение"