Решение Ливена проходит большую часть пути, и, как он заявляет в своих комментариях, это просто вопрос смены концовки на решение Бартека. Конечным результатом является следующий рабочий регекс:
(?<=")\w[\w\s]*(?=")|\w+|"[\w\s]*"
Ввод: вот «моя строка», в ней «шесть совпадений»
Выход:
- Здесь
- есть
- "моя строка"
- он
- есть
- "шесть матчей"
К сожалению, это включает в себя цитаты. Если вместо этого вы используете следующее:
(("((?<token>.*?)(?<!\\)")|(?<token>[\w]+))(\s)*)
И явно захватить совпадения «токена» следующим образом:
RegexOptions options = RegexOptions.None;
Regex regex = new Regex( @"((""((?<token>.*?)(?<!\\)"")|(?<token>[\w]+))(\s)*)", options );
string input = @" Here is ""my string"" it has "" six matches"" ";
var result = (from Match m in regex.Matches( input )
where m.Groups[ "token" ].Success
select m.Groups[ "token" ].Value).ToList();
for ( int i = 0; i < result.Count(); i++ )
{
Debug.WriteLine( string.Format( "Token[{0}]: '{1}'", i, result[ i ] ) );
}
Отладочный вывод:
Token[0]: 'Here'
Token[1]: 'is'
Token[2]: 'my string'
Token[3]: 'it'
Token[4]: 'has'
Token[5]: ' six matches'