С учетом строки типа "TAG1: a, b, c TAG2: 123 TAG3: a, 45,44, b"
Pattern tokens = Pattern.compile( "([a-zA-Z0-9]+):\\s*(\\w+(?:,?\\w+)*)" );
Matcher m = tokens.matcher( myString );
while( m.find() ) {
System.out.println( "tag:" + m.group(1) + " value:" + m.group(2) );
}
Это охватывает все ваши дела и обеспечивает определенную правильную форму. Дайте мне знать, если я что-то упускаю из вашего вопроса.
Редактировать 1:
Чтобы покрыть другой случай, вы можете сделать что-то вроде:
Pattern tokens = Pattern.compile( "([a-zA-Z0-9]+):\\s*(\\w+(?:[ ,]+?\\w+)*)(?=\\s+[a-zA-Z0-9]+:)|([a-zA-Z0-9]+):\\s*(\\w+(?:[ ,]+?\\w+)*)" );
А затем проверьте группы 3 и 4.
Тем не менее, это регулярное выражение становится чересчур амбициозным ... хотя я не уверен, что полный анализатор сделает вашу жизнь намного проще в этом случае.
Альтернатива состоит в том, чтобы разбить его на один уровень за раз (что в любом случае будет делать парсер):
Pattern main = Pattern.compile( "([a-zA-Z0-9]+):" );
Matcher m = main.matcher(myString);
int lastStart = 0;
while( m.find() ) {
if( lastStart != 0 ) {
processToken( myString.substring(lastStart, m.start()) );
}
lastStart = m.start();
}
processToken( myString.substring(lastStart) );
Или что-то в этом роде. Это похоже на принудительный разделитель &, но оно учитывает неявное разделение, которое является вашим синтаксисом токена.