用正则表达式解析C#扩展方法中的字符串
我需要创建扩展方法来分割我的字符串 例如: 如果我有绳子 命令1已处理“作业命令”20160801 09:05:24 应该像这样分开 命令 一, 加工 “作业命令” 20160801 09:05:24 其他例子。 如果我有字符串: 命令2错误06 00000032“消息窗口仍处于活动状态。”20160801 09:05:24 它应该像这样分割: 命令 二, 错误 06 00000032 “消息窗口仍处于活动状态。” 20160801 09:05:24 我有解决这个问题的办法。但我相信有更清洁的解决办法 我的解决方案:用正则表达式解析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 我有解决这个问题的办法。但我相信有更清洁的解
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:谢谢!由于提供的示例只使用了“
(双引号),因此我只实现了对它们的支持;但是,解决方案尝试(通过正则表达式)提到了”
。我编辑了“
和”两种情况下的答案