0

のようなパラメータを受け取るコンソールアプリケーションを作成していますget "www.site.com" -i -a。ただし、このargsはメインコンストラクターのargsパラメーターではなく、から受け取りますConsole.ReadLine()。では、コンソールから受け取る文字列をstring [] argscorrectに解析するにはどうすればよいですか?クライアントがのようなものを書くことができると仮定する必要があるget "www.google.com www.yahoo.com" -i -aので、私の引数は次のようになります。

  1. 得る
  2. 「www.google.comwww.yahoo.com」
  3. -私
  4. -a
4

3 に答える 3

2

正規表現を使用して、次のような単純な字句解析を行うことができます。

var s = @"get ""www.google.com www.yahoo.com"" -i -a";
var ms = Regex.Matches(s, "(-?\\w+)|\"([^\"]*)\"");
foreach (Match m in ms) {
    if (m.Groups[1].ToString() != "") {
         Console.WriteLine("Flag/Command: {0}", m.Groups[1]);
    } else {
        Console.WriteLine("Quoted string: '{0}'", m.Groups[2]);
    }
}

このソリューションの中心は、次の正規表現です(読みやすくするために引用符はエスケープされていません)。

(-?\\w+)|"([^"]*)"

2つのキャプチャグループがあります。最初のグループはフラグまたはコマンド用で、2番目のグループ(パイプ記号'|'の後)は引用符で囲まれた文字列用です。式が引用符を「認識」すると、終了引用符が見つかるまですべてをキャプチャします。キャプチャグループは、両方の引用符を括弧の外に置いて削除します。

ideoneへのリンク。

于 2012-10-23T14:51:52.923 に答える
1

次のような正規表現を使用できます

([^" ][^ ]*)|("[^"]*")

単一の文字列に一致します。だから何かのような

var r = new Regex("([^\" ][^ ]*)|(\"[^\"]*\")");
var s = Console.ReadLine();
var result = r.Matches(s).OfType<Match>().Select(m=>m.Value).ToArray();

目的の配列を取得する必要があります。

于 2012-10-23T14:54:50.800 に答える
0

TextFieldParserMicrosoft.VisualBasic.dllのクラスを使用できます。

string arguments = Console.ReadLine();
TextFieldParser parser = new TextFieldParser(new StringReader(arguments));
parser.Delimiters = new[] { " " };
parser.HasFieldsEnclosedInQuotes = true;
string[] parsedArguments = parser.ReadFields();
于 2012-10-23T14:49:48.780 に答える