Сопоставьте все, кроме символа, если за ним не следует какой-то другой символ


У меня есть такая странная строка:

firstName:Paul Henry,retired:true,message:A, B & more,title:mr

Который должен быть разбит на свои <key>:<value> пары. К сожалению, пары ключ / значение разделены ,, которая сама может быть частью значения. Следовательно, простое разбиение строки на , не даст правильного результата.

Ключи содержат только символы слова, а значения могут содержать :.

То, что мне нужно (я думаю), это что-то вроде

w*:match-anything-but-comma-unless-comma-is-followed-by-space

Что это за произведения

w*:[w ?!&%,]*(?![^,])

Но, конечно, я не хотел бы явно перечислите все символы в классе символов (просто перечислите несколько для этого примера).

2 2

2 ответа:

Если вы хотите разделить на запятую, если за запятой не следует пробел, почему бы просто не:

,(?=\S)

Не знаю, какой язык вы используете, но в C# строка может выглядеть так:

splitArray = Regex.Split(subjectString, @",(?=\S)");

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

В вашем случае вы хотите разделить входные данные на запятые. Если вы получаете кусок, который не содержит двоеточие, вы хотите рассматривать его как часть предыдущего куска. Так что просто напиши это. Например, в Python я бы сделал это так:

chunks = input.split(',')
associations = []
for chunk in chunks:
    if ':' in chunk:
        associations.append(chunk)
    else:
        associations[-1] += ',' + chunk

map = dict(association.split(':') for association in associations)