Lieven de la solution en prend le chemin, et tel qu'il l'expose dans ses commentaires, c'est juste une question de changer la fin de Bartek de la solution. Le résultat final est le suivant travail regEx:
(?<=")\w[\w\s]*(?=")|\w+|"[\w\s]*"
Entrée: Voici "ma chaîne" il a "six matches"
Sortie:
- Ici
- est
- "ma chaîne"
- il
- a
- "six matches"
Malheureusement, c'est entre guillemets. Si vous utilisez plutôt la commande suivante:
(("((?<token>.*?)(?<!\\)")|(?<token>[\w]+))(\s)*)
Et explicitement, de capturer le "jeton" des matchs comme suit:
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 ] ) );
}
La sortie de débogage:
Token[0]: 'Here'
Token[1]: 'is'
Token[2]: 'my string'
Token[3]: 'it'
Token[4]: 'has'
Token[5]: ' six matches'