2013-09-06 1 views
1

Я пытаюсь исключить совпадения в кавычках в RegEx. Эта строка является моя тема:RegEx исключает совпадения между кавычками

ONEKEY=VAL1, TWOKEY=VAL2, THREEKEY="VAL3.1, VAL3.2", FOURKEY=VAL4 

Я хочу разделить эту строку (с помощью NSRegularExpression в Mac OS) и получить ассоциативный массив. Чтобы было проще, я сначала хотел разбить строку на пары KEY=VALUE и либо легко взорвать их на =, либо использовать другой RegEx на моей итерации. Моя проблема заключается в том, что я не могу исключить работу цитируемых значений. Вот моя RegEx:

(?=(.))([^,\s]*) 

Я уже пытался что-то вроде этого: (?=(.))([^"])?([^,\s]*)([^"])? и (?=([^"]?.[^"]?))([^,\s]*)

+0

Я имею в виду, что я «раскалываюсь». Потому что я ** фактически ** использую сопоставление. Но в итерации моих совпадений я создаю «расщепления» моей строки. Вы правы, это не так хорошо :-) –

+0

Я имею в виду соответствие парам значений ключей вместо того, чтобы их разбить. Извините за то, что я не понимаю. – nhahtdh

ответ

2

Как о поиске:

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

Затем экстракт группы 1 (ключ) и 2 (значение (ы)).

[^=]+ - один или несколько символов, которые не являются =.
"[^"]*" - любые символы между кавычками.
[^,]+ - один или несколько символов, которые не являются ,.
(?:,\s*)? - потребляет , с любыми пробелами после него (единственная разница между (...) и (?:...) заключается в том, что последний не присваивает ей группу).

Это не будет работать, если скобки могут быть вложены.

Test.

+0

Обратите внимание, что это не подтверждает входную строку. Если во входной строке есть ошибка, этот метод не сможет обнаружить и просто сопоставить все, что удовлетворяет регулярному выражению. – nhahtdh

+0

@nhahtdh Действительно. Я просто сделал минимальные предположения относительно ввода. Предполагая, что это будет действительное изменение, изменив '[^ =]' на '[^ =," \ s] '(или, возможно,' \ w') и '[^,]' на '[^," \ s] ', наряду с проверкой начальных и конечных положений совпадений (' \ G'?), может помочь в этом. – Dukeling

+1

Фактически, тем важнее то, что OP не имеет спецификации для пары значений ключа. В противном случае написать регулярное выражение для соответствия + проверка будет очень легко. (И да, '\ G' очень полезен при разборе таких вещей). – nhahtdh