2012-12-05 2 views
0

Учитывая следующую строку, я хотел бы создать массив с каждым из ключей/значений.Регулярное выражение, соответствующее цитируемой строке или пробелу

это мой тест строки:

key1:value1 key2: value2 key3:"value3" key4: "value4" key5:'value5' key6: 'value6' 

Ожидаемый результат:

params[key1] == 'value1' 
params[key2] == 'value2' 
params[key3] == 'value3' 
params[key4] == 'value4' 
params[key5] == 'value5' 
params[key6] == 'value6' 

Это то, что я до сих пор, но он не работает с "или" цитирует строки или пробелы после толстой кишки.

var re = /([^ ]*):([^ ]*)/g 

while (match = re.exec(subject)) { 
    params[match[1]] = match[2]; 
} 

ответ

0

Вы близки.

/([^ ]+):\s*(['"]?[^ '"]+['"]?)/g 

Это должно быть сделано. Обратите внимание, что это не даст подтверждения, так что key1: value1" или key1: 'value1" все равно пройдет. Валидация потребует более сложного шаблона.

+0

Это то, что мне нужно. Спасибо! Мои глаза начинают скрещиваться, когда я смотрю на эти RegEx слишком долго. –

+0

Я фактически пропустил требование. Причина для «» заключается в том, что значение может содержать пробел. Итак, key7: «Мой ключ». Используя ваши совпадения «key7» и «My» (не «Мой ключ»). Что мне нужно изменить, чтобы соответствовать полностью цитируемой строке? –

+0

@ChrisDev - я думаю '/ ([^] +): \ s * ([^] + | '[^'] + '|" [^ "] +")/g' должен это сделать. обеспечить достойную (хотя, может быть, и не идеальную) проверку. –

Смежные вопросы