2013-12-12 3 views
1

Я изо всех сил стараюсь иметь регулярное выражение для разделения ключей и значений.perl регулярное выражение для одиночного разделителя символов

Требование состоит в том, что разделитель равен: :, но ключи могут иметь несколько «::». Значения могут иметь «:», но клавиши не могут. Итак, первый «:» должен быть разделителем. Если перед значениями есть какое-либо пространство, оно должно быть устранено.

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

if ($_ =~ /^(.+?):\s+(.*)$/) 
{ 
    $data{$1} = $2; 
} 

действительных ключевых значений:

key:value 
key: value 
key: value::subvalue 
key::subkey:value 
key::subkey:value:subvalue 
key::subkey: value:subvalue 
key::subkey::subsubkey:value 

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

Любые идеи?

Я могу иметь elsif и добавить другое регулярное выражение, но мне интересно, могу ли я иметь одно регулярное выражение для всего этого.

Спасибо,

+1

Можем ли мы получить примерный набор действительных и недействительных строк? – Vache

+0

Я добавил несколько примеров ключевых значений. – Amir

+1

@Amir: пожалуйста, можете ли вы добавить недопустимые примеры? –

ответ

1

Вы можете использовать этот шаблон:

/^((?>[^:]+|::)+):\s*(.*)$/ 
Смежные вопросы