2015-12-29 3 views
-2

У меня пример выражение:выражение между фигурной скобкой с внутренним выражением

firstName =:'Mon';lastName =:'Arthur';:or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};lastName =:'aa';:and{length >:'33';:or{color =:'red'};width <:'2'};date <:'2012';:!{source =:'dictionary,locale'} 

и регулярное выражение должно соответствовать:

  1. : или {размер>: '20'; ЬавЬЫате ^: 'Н' ; и {company |: 'lon'; или {company |: 'we'}}}
  2. : и {длина>: '33';: или {color =: 'red'}; width <: '2'}
  3. :! {Source =: 'dictionary, locale'}

Так что регулярное выражение должно соответствовать выражению, которое начинается с ':[anycharacters]{' и заканчивается '}', а выражение между этими фигурными скобками также может содержать внутреннее выражение, которое может совпадать.

Я пытаюсь что-то написал: https://regex101.com/r/gM3dR9/13 и возвращение:

  1. : или {размер>: '20'; LastName ^: 'H';: и {компании |: 'долгота' ;: или {компании |: 'мы'} - OK
  2. : и {длина>: '33';: или {цвет =: 'красный'} -MISSING ;width <:'2'}
  3. : {источник =: 'словарь , locale '} -OK
+0

То, что вы пытаетесь сделать, невозможно с регулярным выражением. Какой твой язык? –

+0

@JanDvorak Java –

+2

Возможно, попробуйте ';: (\ S + (?: {. *?} (?= $ |; [^}] *; :))) ' –

ответ

1

Я пытался выработать решение, которое соответствует ваш пример и требования вы написали, но я не уверен, если я его полностью:

(?:;:)(\S+(?:{.*?}(?=[^}]*$|;[^}]*;:))) 

Это использует положительный предпросмотр, чтобы гарантировать, что последняя закрывающая скобка правильно пойманной (он должен следовать конец строки или другой ;:)

Если это возможно, что ваш матч начало строки, и для этого не протекала по ;: вы можете изменить часть (?:;:) к (?:^|;:)

Вот ссылка на Regex101: https://regex101.com/r/dV8uI4/1

0

Попробуйте этот regEx

(:or{.*?\};{1,})|(:and{.*\};)|(:!{.*?\};{0,}) 

Я не могу гарантировать для любого другого сложного случая, но это, безусловно, то, что вы упомянули в качестве выхода За исключением дополнительной «;»

"firstName =:'Mon';lastName =:'Arthur';:or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};lastName =:'aa';:and{length >:'33';:or{color =:'red'};:width <:'2'};date <:'2012';:!{source =:'dictionary,locale'}".match(/(:or{.*?\};{1,})|(:and{.*\};)|(:!{.*?\};{0,})/g) 

Выход

[":or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};", ":and{length >:'33';:or{color =:'red'};:width <:'2'};", ":!{source =:'dictionary,locale'}"] 

отформатированный выход

[ 
":or{size >:'20';lastName ^:'H';:and{company |:'lon';:or{company |:'we'}}};", 
":and{length >:'33';:or{color =:'red'};:width <:'2'};", 
":!{source =:'dictionary,locale'}" 
] 

tested Here - Java RegEx Tester