【问题标题】:How split this specific string into array [duplicate]如何将此特定字符串拆分为数组[重复]
【发布时间】:2022-01-26 18:22:43
【问题描述】:

如何将这个带有空格的特定字符串拆分为数组?
MyDatabase C:\MyDatabase\Backup "C:\Program Files\MySQL\MySQL Server 8.0\bin"
我想要这样的数组:\

[MyDatabase], [C:\MyDatabase\Backup], ["C:\Program Files\MySQL\MySQL Server 8.0\bin"]


我无法为 .Split() 函数匹配任何特定的分隔符

【问题讨论】:

  • 您可以使用 ("[^"]+")|[^ ]+ 作为正则表达式模式。
  • 它实际上是一个以空格而不是逗号作为分隔符的 CSV。不要重新发明 CSV 解析,只需使用现有的解析并让您设置分隔符。如果您不想这样做,请编写一个简单的有限状态机来进行解析;逐个字符地读取行字符-您要么是布尔值“在" 报价内”,要么是“不在报价内”,因此每次遇到报价时都要切换布尔值。如果你不在 inside_a_quote 并且你遇到了一个空格,那么从当前位置取一段字符串回到你最后取一段的地方
  • @Luuk 不是真的
  • 看看 Mark Bracektt 在stackoverflow.com/questions/959448/split-csv-string 中的回答——它是 VB,但它对 C# 开发人员来说是可读的,因为它很简单:一次是字符,检查它,切换它是否是引用。如果它既不是定界符也不是引号,它将char连接到一个字符串上是非常低效的,所以我将它调整为只有一个int变量来记住最后一次拆分的位置,并从那里添加子字符串到列表是必需的..
  • 或者我会使用字符串生成器而不是字符串,并将字符连接到其中,以便在将单词添加到列表时对其进行字符串化和清除

标签: c# string split


【解决方案1】:

如果您正在编写代码来解析命令行参数,您可以使用the NuGet package System.CommandLine

添加该包后,您可以编写如下代码:

using System;
using System.CommandLine;

namespace Demo
{
    static class Program
    {
        static void Main()
        {
            string commandLine = "MyDatabase C:\\MyDatabase\\Backup \"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\"";

            var cmd    = new RootCommand();
            var result = cmd.Parse(commandLine);

            Console.WriteLine($"{result.Tokens.Count} arguments found:");

            foreach (var argument in result.Tokens)
            {
                Console.WriteLine(argument);
            }
        }
    }
}

该程序的输出是:

3 arguments found:
Argument: MyDatabase
Argument: C:\MyDatabase\Backup
Argument: C:\Program Files\MySQL\MySQL Server 8.0\bin

这有点像“破解坚果的大锤”,但如果您真的在解析命令行参数,System.CommandLine 提供了很多功能,而不仅仅是基本解析。

【讨论】:

    【解决方案2】:

    试试这个

    var path = @"MyDatabase C:\MyDatabase\Backup ""C:\Program Files\MySQL\MySQL Server 8.0\bin""";
                var pattern = @"(?<FirstWord>\w+)\s(?<Path1>.*)\s(?<Path2>\"".*\"")";
                Debug.WriteLine(path);
                Regex rgx = new Regex(pattern);
                Match match = rgx.Match(path);
                if (match.Success)
                    ShowMatches(rgx, match);
    
    private static void ShowMatches(Regex r, Match m)
            {
                string[] names = r.GetGroupNames();
                Debug.WriteLine("Named Groups:");
                foreach (var name in names)
                {
                    Group grp = m.Groups[name];
                    Debug.WriteLine("   {0}: '{1}'", name, grp.Value);
                }
            }
    

    【讨论】:

      【解决方案3】:
       var s=@"mydbbb D:\\mssql ""C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\""";
      
       Console.WriteLine(s.Split(' ')[0]);
       Console.WriteLine(s.Split(' ')[1]);
      
       int i = s.IndexOf(' ');
       i = s.IndexOf(' ', i + 1);
       Console.WriteLine(s.Substring(i));
      

      【讨论】:

      • 我无法编辑字符串 :x "mydbbb D:\\mssql \"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\""
      • var s=@"mydbbb D:\\mssql ""C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\""";只需将 /" 替换为 "" 并在字符串的开头添加 @。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2011-12-20
      • 2015-11-25
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多