用正则表达式解析C#扩展方法中的字符串

用正则表达式解析C#扩展方法中的字符串,c#,regex,split,C#,Regex,Split,我需要创建扩展方法来分割我的字符串 例如: 如果我有绳子 命令1已处理“作业命令”20160801 09:05:24 应该像这样分开 命令 一, 加工 “作业命令” 20160801 09:05:24 其他例子。 如果我有字符串: 命令2错误06 00000032“消息窗口仍处于活动状态。”20160801 09:05:24 它应该像这样分割: 命令 二, 错误 06 00000032 “消息窗口仍处于活动状态。” 20160801 09:05:24 我有解决这个问题的办法。但我相信有更清洁的解

我需要创建扩展方法来分割我的字符串

例如: 如果我有绳子

命令1已处理“作业命令”20160801 09:05:24

应该像这样分开

命令

一,

加工

“作业命令”

20160801

09:05:24

其他例子。 如果我有字符串:

命令2错误06 00000032“消息窗口仍处于活动状态。”20160801 09:05:24

它应该像这样分割:

命令

二,

错误

06

00000032

“消息窗口仍处于活动状态。”

20160801 09:05:24

我有解决这个问题的办法。但我相信有更清洁的解决办法

我的解决方案:

 public static List<string> GetTokens(this string line)
        {
            // TODO: Code refactoring:
            var res = new List<string>();
            var parts = Regex.Split(line, "/[^\\s\"']+|\"([^\"]*)\"|'([^']*)'/g");

            var subParts = parts[0].Split(' ');
            foreach (var val in subParts)
            {
                res.Add(val);
            }
            res.Add(parts[1]);
            subParts = parts[2].Split(' ');
            foreach (var val in subParts)
            {
                res.Add(val);
            }

            res.RemoveAll(f => f.Trim() == "");
            return res;
        }
public static List<string> GetTokens(this string line)
{
    return Regex.Matches(line,
        @""".*?""|\S+").Cast<Match>().Select(m => m.Value).ToList();
}
公共静态列表GetTokens(此字符串行)
{
//TODO:代码重构:
var res=新列表();
var parts=Regex.Split(行“/[^\\s\”]+\”([^\“]*)\“\”([^']*)”/g”);
var子部件=部件[0]。拆分(“”);
foreach(子部分中的var val)
{
决议添加(val);
}
决议增补(第[1]部分);
子部分=部分[2]。拆分(“”);
foreach(子部分中的var val)
{
决议添加(val);
}
res.RemoveAll(f=>f.Trim()==”);
返回res;
}

我想实施更清洁的解决方案。有什么想法吗?

过了一会儿,a想出了一些简单的代码:

public static List<string> GetTokens(this string line)
{
    return Regex.Matches(line, @"([^\s""]+|""([^""]*)"")").OfType<Match>().Select(l => l.Groups[1].Value).ToList();
}
公共静态列表GetTokens(此字符串行)
{
返回Regex.Matches(第行,@“([^\s”“]+|”“([^”“]*))”)of type()。选择(l=>l.Groups[1].Value)。ToList();
}
我用一个
消息框测试代码,该消息框显示了
列表
,每个项目之间都有


过了一会儿,a想出了一些简单的代码:

public static List<string> GetTokens(this string line)
{
    return Regex.Matches(line, @"([^\s""]+|""([^""]*)"")").OfType<Match>().Select(l => l.Groups[1].Value).ToList();
}
公共静态列表GetTokens(此字符串行)
{
返回Regex.Matches(第行,@“([^\s”“]+|”“([^”“]*))”)of type()。选择(l=>l.Groups[1].Value)。ToList();
}
我用一个
消息框测试代码,该消息框显示了
列表
,每个项目之间都有

我建议实现一个简单的循环,而不是复杂的正则表达式:

输出

 COMMAND
 2
 ERROR
 06
 00000032
 "Message window is still active."
 20160801
 09:05:24
编辑:如果您想要两种报价类型,分别为
(双引号)和
(单引号):

公共静态IEnumerable GetTokens(字符串值){
if(string.IsNullOrEmpty(value))
屈服断裂;
bool-inquote=false;
bool inApostroph=false;
int指数=0;
对于(int i=0;i
我建议实现一个简单的循环,而不是复杂的正则表达式:

输出

 COMMAND
 2
 ERROR
 06
 00000032
 "Message window is still active."
 20160801
 09:05:24
编辑:如果您想要两种报价类型,分别为
(双引号)和
(单引号):

公共静态IEnumerable GetTokens(字符串值){
if(string.IsNullOrEmpty(value))
屈服断裂;
bool-inquote=false;
bool inApostroph=false;
int指数=0;
对于(int i=0;i
您可以使用正则表达式,例如:
([^\s”]+|“[^”]*”
和全局标识符


您可以使用正则表达式,例如:
([^\s”]+|“[^”]*”
和全局标识符

纯正则表达式解决方案:

 public static List<string> GetTokens(this string line)
        {
            // TODO: Code refactoring:
            var res = new List<string>();
            var parts = Regex.Split(line, "/[^\\s\"']+|\"([^\"]*)\"|'([^']*)'/g");

            var subParts = parts[0].Split(' ');
            foreach (var val in subParts)
            {
                res.Add(val);
            }
            res.Add(parts[1]);
            subParts = parts[2].Split(' ');
            foreach (var val in subParts)
            {
                res.Add(val);
            }

            res.RemoveAll(f => f.Trim() == "");
            return res;
        }
public static List<string> GetTokens(this string line)
{
    return Regex.Matches(line,
        @""".*?""|\S+").Cast<Match>().Select(m => m.Value).ToList();
}
公共静态列表GetTokens(此字符串行)
{
返回正则表达式匹配项(第行,
@“*?”“|\S+”.Cast().Select(m=>m.Value.ToList();
}
正则表达式匹配带引号的字符串或非空格字符序列。然后,这些匹配项可以一次性作为集合返回

下面是一个演示:.

一个纯正则表达式解决方案:

 public static List<string> GetTokens(this string line)
        {
            // TODO: Code refactoring:
            var res = new List<string>();
            var parts = Regex.Split(line, "/[^\\s\"']+|\"([^\"]*)\"|'([^']*)'/g");

            var subParts = parts[0].Split(' ');
            foreach (var val in subParts)
            {
                res.Add(val);
            }
            res.Add(parts[1]);
            subParts = parts[2].Split(' ');
            foreach (var val in subParts)
            {
                res.Add(val);
            }

            res.RemoveAll(f => f.Trim() == "");
            return res;
        }
public static List<string> GetTokens(this string line)
{
    return Regex.Matches(line,
        @""".*?""|\S+").Cast<Match>().Select(m => m.Value).ToList();
}
公共静态列表GetTokens(此字符串行)
{
返回正则表达式匹配项(第行,
@“*?”“|\S+”.Cast().Select(m=>m.Value.ToList();
}
正则表达式匹配带引号的字符串或非空格字符序列。然后,这些匹配项可以一次性作为集合返回


这是一个演示:。

清洁还是工作?这个-
“/[^\\s\”]+\”([^\“]*)\“\”([^']*)”/g“
”显然不起作用。那么,你的输入没有转义序列,是吗?更干净还是工作?这个-
“/[^\\s\”]+\”([^\“]*)\“\”([^']*)”/g“
”显然不起作用。那么,您的输入没有转义序列,是吗?看起来您没有处理单引号文本。@Wiktor Stribiżew:谢谢!由于提供的示例只使用了
(双引号),因此我只实现了对它们的支持;但是,解决方案尝试(通过正则表达式)中提到了
。我编辑了答案,以防两者都
requiredIt看起来您没有处理单引号的文本。@Wiktor Stribiżew:谢谢!由于提供的示例只使用了
(双引号),因此我只实现了对它们的支持;但是,解决方案尝试(通过正则表达式)提到了
。我编辑了
”两种情况下的答案