Разбор пар имя-значение в Java - PullRequest
0 голосов
/ 25 января 2012

Существует ли какое-либо решение с открытым исходным кодом или универсальное регулярное выражение для анализа пар имя-значение (ключ-значение) из случайной строки в Java с удаленными (необязательными) разделителями?

Из Регулярного выражения для разбора пар имя-значение , одним из таких регулярных выражений может быть

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

Однако вышеупомянутое (и его варианты в вышеупомянутом вопросе), хотя и работает, как и ожидалось, возвращает разделители вместе со значением.

Например, пара типа key="value" будет выдавать {ключ , "значение"} вместо {ключ, значение} .

Последняя форма вывода будет более приятной, поскольку она позволяет избежать постобработки строки для удаления ограничителей (в данном случае это кавычки).

1 Ответ

1 голос
/ 25 января 2012

Если вы хотите, чтобы форма придерживалась необязательных кавычек без их указания в захвате ключа или значения, вы можете сделать что-то вроде этого (используя свое регулярное выражение в качестве примера и включая возможные одинарные кавычки в качестве разделителей).

Буферы захвата 2,4 содержат пары ключ-значение (без кавычек).

"
 (['\"]?)  ([^'\"=,]+)  \1
 =
 (['\"]?)  ([^'\"=,]+)  \3
"

Но при этом будут собраны возможные значения мусора, разделенные знаком =.
Я думаю, что лучшепредоставьте класс, который включает ограниченное допустимое valeus вместо этого.

Что-то вроде этого - то, что я использовал бы.

"
 (['\"]?) \s* (\w[-:\s\w]*?) \s* \1
 \s* = \s*
 (['\"]?) \s* (\w[-:\s\w]*?) \s* \3
"

возможная жадная версия

\w+ (?: \s+[-:\w]+ )*
или
[-:\w]+ (?: \s+[-:\w]+ )*

в этом

"
 (['\"]?) \s* (\w+(?:\s+[-:\w]+)*) \s* \1
 \s* = \s*
 (['\"]?) \s* (\w+(?:\s+[-:\w]+)*) \s* \3
"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...