使用Regex根据出现的不同字符来分割字符串

时间:2019-10-29 16:17:29

标签: c# regex

我当前正在替换一个非常老(很长)的C#字符串解析类,我认为可以将其压缩为一个正则表达式语句。作为Regex的新手,我在使其正常工作时遇到了一些问题。

可能的输入字符串的描述:

输入字符串最多可以包含三个单词,并用空格分隔。它可以在此停止,也可以包含=,后接更多的单词(任意数量),并用逗号分隔。这些词也可以包含在引号中。如果单词用引号引起来并带有空格,则不应将其用空格分开。

字符串数组中输入和预期输出元素的示例:

输入1: this is test 输出1: {"this", "is", "test"}

输入2: this is test=param1,param2,param3

输出2: {"this", "is", "test", "param1", "param2", "param3"}

输入3: use file "c:\test file.txt"=param1 , param2,param3

输出3: {"use", "file", "c:\test file.txt", "param1", "param2", "param3"}

输入4: log off

输出4: {"log", "off"}

最复杂的一个:

输入5: use object "c:\test file.txt"="C:\Users\layer.shp" | ( object = 10 ),param2

输出5: {"use", "object", "c:\test file.txt", "C:\Users\layer.shp | ( object = 10 )", "param2"}

因此,请对此进行细分:

  • 我需要按空格分隔最多前三个词
  • 然后,如果有=,请忽略=并以逗号分隔。
  • 如果前三个词之一周围带有引号,并且包含空格,则请包含该空格(不要拆分)

这是我最近的正则表达式:

\w+|"[\w\s\:\\\.]*"+([^,]+)

这似乎是根据空格和=之后的逗号来分割字符串。但是,如果前三个单词之一被引号引起来,则出于某种原因似乎包含=。另外,我不确定如何仅将字符串中的前三个词按空格分开,如果有=,其余部分按逗号隔开。

我的解决方案的一部分似乎是与{}一起使用量词,但是我无法正确设置它。

1 个答案:

答案 0 :(得分:2)

没有正则表达式。无法使用字符串方法时,应使用正则表达式。 :

            string[] inputs = { 
                              "this is test",
                              "this is test=param1,param2,param3",
                              "use file \"c:\\test file.txt\"=param1 , param2,param3",
                              "log off",
                              "use object \"c:\\test file.txt\"=\"C:\\Users\\layer.shp\" | ( object = 10 ),param2"
                          };

            foreach (string input in inputs)
            {
                List<string> splitArray;
                if (!input.Contains("="))
                {
                    splitArray = input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
                }
                else
                {
                    int equalPosition = input.IndexOf("=");
                    splitArray = input.Substring(0, equalPosition).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
                    string end = input.Substring(equalPosition + 1);
                    splitArray.AddRange(end.Split(new char[] { ',' }).ToList());
                }
                string output = string.Join(",", splitArray.Select(x => x.Contains("\"") ? x : "\"" + x + "\""));
                Console.WriteLine(output);
            }
            Console.ReadLine();