2015-10-06 4 views
0

Я пытаюсь написать регулярное выражение, которое захватывает две группы: первая представляет собой группу из n слов (где n> = 0 и ее переменная), а вторая представляет собой группу пар с этим форматом field:value , В обеих группах индивиды разделяются пробелами. В конце концов, дополнительное пространство разделяет две группы (если только один из них не пуст/ноль).Регулярное выражение для DSL

Пожалуйста, примите во внимание следующие примеры:

'the big apple'.match(pattern).captures # => ['the big apple', nil] 
'the big apple is red status:drafted1 category:3'.match(pattern).captures # => ['the big apple is red', 'status:drafted1 category:3'] 
'status:1'.match(pattern).captures # => [nil, 'status:1'] 

Я пробовал много комбинаций и узоров, но я не могу заставить его работать. Мой самый близкий шаблон - /([[\w]*\s?]*)([\w+:[\w]+\s?]*)/, но он не работает должным образом во втором и третьем случаях, ранее обнаруженных.

Спасибо!

+0

ли Серия слова и поля: формат значения всегда в этом порядке? – Cyrbil

+0

asiny желаемый результат уже в вопросе! Посмотрите на следующие примеры: D – tehAnswer

+0

да, всегда слова приходят первыми! – tehAnswer

ответ

1

В один регулярок решение:

(.*?)(?:(?: ?((?: ?\w+:\w+)+))|$) 
  • (.*?) матч Anythings, но не жадный и используется, чтобы найти слова
  • то есть группа или конец строки $
  • группа игнорировать пространство ? затем сопоставить все field:value с \w+:\w+

Смотрите пример здесь https://regex101.com/r/nZ9wU6/1 (я имел флаги, чтобы показать поведение, но она работает лучше всего для одного результата)

+0

Ты мой человек! Он отлично работал. Не могли бы вы объяснить немного больше, что '?:' Делает и как работает решение? Мне кажется волшебным: D – tehAnswer

+0

было тяжело, но интересно было: D пришлось переделать его 4 раза, чтобы идеально сочетать все случаи – Cyrbil

1

не регулярное выражение, но дать ему попробовать

string = 'the big apple:something' 
first_result = '' 
second_result = '' 

string.split(' ').each do |value| 
    value.include?(':') ? first_string += value : second_string += value 
end 
+0

Спасибо! Но я пытаюсь решить его с помощью регулярного выражения. В любом случае, я голосовал положительно, потому что вы предложили решение _valid, но альтернативное решение! – tehAnswer

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

  • Нет связанных вопросов^_^