using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
public static class Test
{
private static Regex qoutesRegex = new Regex("(?<!\\\\)\\\"", RegexOptions.Compiled);
public static IEnumerable<string> Split(this string str,
Func<char, bool> controller)
{
int nextPiece = 0;
for (int c = 0; c < str.Length; c++)
{
if (controller(str[c]))
{
yield return str.Substring(nextPiece, c - nextPiece);
nextPiece = c + 1;
}
}
yield return str.Substring(nextPiece);
}
public static IEnumerable<string> SplitCommandLine(string commandLine)
{
bool inQuotes = false;
bool isEscaping = false;
return commandLine.Split(c => {
if (c == '\\' && !isEscaping) { isEscaping = true; return false; }
if (c == '\"' && !isEscaping)
inQuotes = !inQuotes;
isEscaping = false;
return !inQuotes && Char.IsWhiteSpace(c)/*c == ' '*/;
})
.Select(arg => arg.Trim())
.Select(arg => qoutesRegex.Replace(arg, "").Replace("\\\"", "\""))
.Where(arg => !string.IsNullOrEmpty(arg));
}
public static void Main()
{
IEnumerable<string> tests = new List<string> (){
"\"He whispered to her \\\"I love you\\\".\"",
"\"C:\\Program Files\"",
"\"He whispered to her \\\"I love you\\\".\"",
"a\" \\\"asdsd \\\"dsdsd AAA\"b",
"\" \\\"asdsd \\\"dsdsd \"basds",
"sdsd\" \\\"asdsd \\\"dsdsd \"",
"\"A\\\"asdsd \\\"dsdsdA\""
};
foreach (var test in tests){
foreach(var s in SplitCommandLine(test)){
Console.WriteLine("Param `{0}`",s);
}
Console.WriteLine("-----------------");
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKCnB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdAp7Cglwcml2YXRlIHN0YXRpYyBSZWdleCBxb3V0ZXNSZWdleCA9IG5ldyBSZWdleCgiKD88IVxcXFwpXFxcIiIsIFJlZ2V4T3B0aW9ucy5Db21waWxlZCk7CgkKCXB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8c3RyaW5nPiBTcGxpdCh0aGlzIHN0cmluZyBzdHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmM8Y2hhciwgYm9vbD4gY29udHJvbGxlcikKICAgIHsKICAgICAgICBpbnQgbmV4dFBpZWNlID0gMDsKCiAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBzdHIuTGVuZ3RoOyBjKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoY29udHJvbGxlcihzdHJbY10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gc3RyLlN1YnN0cmluZyhuZXh0UGllY2UsIGMgLSBuZXh0UGllY2UpOwogICAgICAgICAgICAgICAgbmV4dFBpZWNlID0gYyArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHlpZWxkIHJldHVybiBzdHIuU3Vic3RyaW5nKG5leHRQaWVjZSk7CiAgICB9CiAgIAoJCnB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8c3RyaW5nPiBTcGxpdENvbW1hbmRMaW5lKHN0cmluZyBjb21tYW5kTGluZSkKewogICAgYm9vbCBpblF1b3RlcyA9IGZhbHNlOwogICAgYm9vbCBpc0VzY2FwaW5nID0gZmFsc2U7CgogICAgcmV0dXJuIGNvbW1hbmRMaW5lLlNwbGl0KGMgPT4gewogICAgICAgIGlmIChjID09ICdcXCcgJiYgIWlzRXNjYXBpbmcpIHsgaXNFc2NhcGluZyA9IHRydWU7IHJldHVybiBmYWxzZTsgfQoKICAgICAgICBpZiAoYyA9PSAnXCInICYmICFpc0VzY2FwaW5nKQogICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlczsKCiAgICAgICAgaXNFc2NhcGluZyA9IGZhbHNlOwoKICAgICAgICByZXR1cm4gIWluUXVvdGVzICYmIENoYXIuSXNXaGl0ZVNwYWNlKGMpLypjID09ICcgJyovOwogICAgICAgIH0pCiAgICAgICAgLlNlbGVjdChhcmcgPT4gYXJnLlRyaW0oKSkKICAgICAgICAuU2VsZWN0KGFyZyA9PiBxb3V0ZXNSZWdleC5SZXBsYWNlKGFyZywgIiIpLlJlcGxhY2UoIlxcXCIiLCAiXCIiKSkKICAgICAgICAuV2hlcmUoYXJnID0+ICFzdHJpbmcuSXNOdWxsT3JFbXB0eShhcmcpKTsKCX0KCQoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCUlFbnVtZXJhYmxlPHN0cmluZz4gdGVzdHMgPSBuZXcgTGlzdDxzdHJpbmc+ICgpewoJCQkiXCJIZSB3aGlzcGVyZWQgdG8gaGVyIFxcXCJJIGxvdmUgeW91XFxcIi5cIiIsCgkJCSJcIkM6XFxQcm9ncmFtIEZpbGVzXCIiLCAKCQkJIlwiSGUgd2hpc3BlcmVkIHRvIGhlciBcXFwiSSBsb3ZlIHlvdVxcXCIuXCIiLCAKCQkJImFcIiBcXFwiYXNkc2QgXFxcImRzZHNkIEFBQVwiYiIsCgkJCSJcIiBcXFwiYXNkc2QgXFxcImRzZHNkIFwiYmFzZHMiLAoJCQkic2RzZFwiIFxcXCJhc2RzZCBcXFwiZHNkc2QgXCIiLAoJCQkiXCJBXFxcImFzZHNkIFxcXCJkc2RzZEFcIiIKCQkJfTsKCQlmb3JlYWNoICh2YXIgdGVzdCBpbiB0ZXN0cyl7CgkJCWZvcmVhY2godmFyIHMgaW4gU3BsaXRDb21tYW5kTGluZSh0ZXN0KSl7CgkJCQlDb25zb2xlLldyaXRlTGluZSgiUGFyYW0gYHswfWAiLHMpOwoJCQl9CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCItLS0tLS0tLS0tLS0tLS0tLSIpOwoJCX0KCX0KfQ==