使用正则表达式来分割模式

时间:2016-02-24 14:22:58

标签: c# regex

我是在正则表达式中使用模式的新手。我已经阅读了微软网站上的一些链接,我以为我理解但是我遇到了这种情况,并且不知道为什么它没有提供我期望的结果。

我想将MyCmd拆分为字符串列表:print,a,+,b ,; 据我所知,正常分割不会保留分隔符。所以,我想我已经尝试使用下面定义的模式的正则表达式: (基本上我想将字符串拆分成列表或队列并保留分隔符;,+ - * / {} [])。

 string MyCmd = "print a+b;";
 private string MyDelim = @"\b[\s;,\+\-\*\/%=\<\>\(\)\{\}\[\]]\w+";
 myStuff = new Queue<string>(Regex.Split(MyCmd,MyDelim));

但到目前为止,我上面的代码并没有产生预期的结果。

我的模式中哪些不正确?

2 个答案:

答案 0 :(得分:1)

我相信你可以使用

var MyCmd = "print a+b;";
var MyDelim = @"([][\s;,+*/%=<>(){}-])";
var myStuff = Regex.Split(MyCmd,MyDelim).Where(p=> !string.IsNullOrWhiteSpace(p)).ToList();

输出:printa+b;

enter image description here

请注意,([][\s;,+*/%=<>(){}-])正则表达式附带(...)捕获组确保捕获的值也会添加到生成的数组中。

您需要.Where(p=> !string.IsNullOrWhiteSpace(p))来摆脱使用Regex.Split获得的空值。

我在你的正则表达式中删除了过多的转义,以便它看起来很精简并且意味着&#34;。

你的正则表达式不起作用的原因是@"\b[\s;,\+\-\*\/%=\<\>\(\)\{\}\[\]]\w+"匹配\b单词边界后面的字符类中的空格和符号(需要在它们之前出现单词字符)然后匹配一个或更多单词字符。由于没有捕获组,所有匹配从结果数组中消失。

答案 1 :(得分:0)

Regex.Split是要走的路。如果使用Regex.Matches,您可以这样做:

string MyCmd = @"print  a+b;";
string MyDelim = @"([^;,+\-*/{}\[\]\)\(\s]+|[;,+\-*/{}\[\]\)\(])";
var myStuff = Regex.Matches(MyCmd, MyDelim).Cast<Match>().ToList().ConvertAll(m => m.Groups[1].Value.ToString());