Я понимаю, что этот вопрос задавался здесь много раз. Я просмотрел и попробовал многие ответы, но ни один из них не работает для меня.
Я создаю приложение с использованием С#, которое может принимать аргументы командной строки. например
Start -p:SomeNameValue -h
DisplayMessage -m:Hello
DisplayMessage -m:'Hello World'
DisplayMessage -m:"Hello World"
Мои аргументы входят в виде одной строки. Мне нужно разделить пробелами, за исключением случаев, когда есть одинарные или двойные кавычки. Таким образом, вышеприведенное закончится как
Start
-p:SomeNameValue
-h
DisplayMessage
-m:Hello
DisplayMessage
-m:'Hello World'
DisplayMessage
-m:"Hello World"
Ответы, которые я нашел здесь, кажется, ломаются. например Они удаляют символ :
или вообще не работают. Некоторые из кодов, которые я пробовал, выглядят следующим образом:
var res1 = Regex.Matches(payload, @"[\""].+?[\""]|[^ ]+")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
var res2 = payload.Split('"')
.Select((element, index) => index % 2 == 0
? element.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
: new string[] { element }) // Keep the entire item
.SelectMany(element => element).ToList();
var res3 = Regex
.Matches(payload, @"\w+|""[\w\s]*""")
.Cast<Match>()
.Select(m => m.Groups["match"].Value)
.ToList();
string[] res4 = Regex.Split(payload, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
Regex regex = new Regex(@"\w+|""[\w\s]*""");
var res5 = regex.Matches(payload).Cast<Match>().ToList();
Я просто хочу разбить аргумент на блоки, как указано выше.
app.exe abc "xyz 123"
, ваша основная функция увидит два аргумента командной строки, один"abc"
, а другой"xyz 123"
- person Flydog57   schedule 03.03.2021