Вы не указали, какой движок регулярных выражений вы используете, но это работает, если у вас есть lookahead / lookbehind.
Он работает при условии, что все ключи только в верхнем регистре, тогда как значения не являются - не уверен, что это правильное предположение, но если это не так, как отмечалось, все станет сложным и запутанным.
(?<=[+-\/])[A-Z]+=(?:(?![A-Z]+=)[^=])+(?=[+-\/]|$)
И вот моя попытка объяснить это (не уверен, насколько это имеет смысл):
(?x) # enable regex comment mode
(?<=[+-\/]) # start with one of the delimiters, but excluded from match
[A-Z]+ # match one or more uppercase (for the key)
= # match the equal sign
(?: # start non-capturing group
(?! # start negative lookahead, to prevent keys matching
[A-Z]+= # a key and equals (since in negative lookahead, this is what we exclude)
) # end the negative lookahead
[^=] # match a character that's not =
)+ # end non-capturing group, match one or more times, until...
(?=[+-\/]|$) # next char must be delimiter or end of line for match to succeed
1011 *
*
Для Java string-> regex обратные косые черты необходимо экранировать (как в кавычках, если они есть):
Pattern p = Pattern.compile("(?<=[+-\\/])[A-Z]+=(?:(?![A-Z]+=)[^=])+(?=[+-\\/]|$)");
И если требуются группы захвата, просто добавьте скобки вокруг соответствующих частей:
Pattern p = Pattern.compile("(?<=[+-\\/])([A-Z]+)=((?:(?![A-Z]+=)[^=])+(?=[+-\\/]|$))");
Соответствующая часть этого, чтобы превратить его в текст с разделителями новой строки, что-то вроде ...
Matcher m = p.Matcher( InputText );
StringBuffer Result = new StringBuffer("");
while ( m.find() )
{
Result.append( m.Group() + "\n" );
}