将字符串拆分(不解析)到命令行参数 C# [重复]
Posted
技术标签:
【中文标题】将字符串拆分(不解析)到命令行参数 C# [重复]【英文标题】:Split (NOT PARSE) a string into command line args C# [duplicate] 【发布时间】:2017-02-07 09:06:05 【问题描述】:问候,
我有一个看似简单的问题,但实际上并非如此。我想获取一个字符串并将其拆分为命令行参数。我已经在谷歌上搜索这个问题好几个星期了,找不到任何适合我需要的东西。
例如,以下行:
--foo=bar -foo="bar test" --foo "bar \"test\"" --foo bar
将分为:(按此顺序)
--foo=bar
-foo=bar test
--foo
bar "test"
--foo
bar
编辑
是的,我意识到 --foo 不止一次使用。这是拆分/标记化。不解析,这是下一步。我不在乎我去解析时是否会出错。我现在想做的是将字符串转换为数组状态,然后我可以将其输入 Mono.Options
编辑 2
阅读示例。这就是我想要完成的。 只是。
【问题讨论】:
您是否创建了 MCVE? 为什么要拆分 args?这通常在您使用控制台执行应用程序时自动完成。然而,解析 args 有很多工具,例如 CommandLine-parser。 @HimBromBeere 这不是一次性应用程序。命令字符串将从套接字连接提供 @Cole - 最好在问题中明确你不是从实际命令行中得到这个但想要复制操作系统所做的解析。 @Cole check this question 使用 String.Split 或正则表达式对命令行进行标记并非易事。基于字符的解析器要容易得多。 Windows 也为此提供了一个 Win32 API 函数,CommandLineToArgvW
【参考方案1】:
如果您正在运行控制台应用程序,命令行参数将传递给 Main 方法 (String[] args)。
无论如何,如果你想拆分你的参数,假设参数在一个字符串变量中,你可以这样做:
var arguments = "--foo=bar -foo=\"bar test\" --foo \"bar \"test\" --foo bar";
var options = arguments.Split(new String[] "-", "--" , StringSplitOptions.RemoveEmptyEntries);
// Output
// [0]: "foo=bar "
// [1]: "foo=\"bar test\" "
// [2]: "foo \"bar \"test\" "
// [3]: "foo bar"
【讨论】:
这也会拆分“bar test” 您需要检查 Split 方法的重载,使用这行代码: var array = arguments.Split(new String[] "-", "--" , StringSplitOptions.RemoveEmptyEntries);你得到 4 个参数 解析命令行比简单地拆分字符串要复杂一些。例如,此命令行包含单个参数foo
的四个 值。此外,一个好的解析器应该能够处理动词、动词参数和不同的参数标识符如/
、-
和--
。它应该能够处理带引号的值,这是 Split 无法做到的。即使是正则表达式也会遇到问题
所有这些都应该有一个易于使用的 API,这就是为什么使用 .NET 的 System.CommandLine、NDesk 或 CommandLineParser 等库来完成命令行解析的原因
@H.Herzl 您的方法会将-foo="bar hello"
拆分为-foo="hello
AND hello"
【参考方案2】:
只需使用Environment.GetCommandLineArgs()
。
这将为您提供代表命令行参数的字符串数组
【讨论】:
环境变量与命令行参数完全不同。可以使用Environment.GetCommandLineArgs
获取命令行参数。
sry...ment this :(
仍然不是 OP 想要的......
OP 已经有一个命令行。问题是,你如何解析它,即从中获取有意义的数据
@PanagiotisKanavos 如果通过解析您的意思是拆分/标记化,那么是的。你是对的以上是关于将字符串拆分(不解析)到命令行参数 C# [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中解析 powershell 样式的命令行参数 [重复]