我当前正在替换一个非常老(很长)的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\:\\\.]*"+([^,]+)
这似乎是根据空格和=
之后的逗号来分割字符串。但是,如果前三个单词之一被引号引起来,则出于某种原因似乎包含=
。另外,我不确定如何仅将字符串中的前三个词按空格分开,如果有=
,其余部分按逗号隔开。
我的解决方案的一部分似乎是与{}
一起使用量词,但是我无法正确设置它。
答案 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();