我是在正则表达式中使用模式的新手。我已经阅读了微软网站上的一些链接,我以为我理解但是我遇到了这种情况,并且不知道为什么它没有提供我期望的结果。
我想将MyCmd拆分为字符串列表:print,a,+,b ,; 据我所知,正常分割不会保留分隔符。所以,我想我已经尝试使用下面定义的模式的正则表达式: (基本上我想将字符串拆分成列表或队列并保留分隔符;,+ - * / {} [])。
string MyCmd = "print a+b;";
private string MyDelim = @"\b[\s;,\+\-\*\/%=\<\>\(\)\{\}\[\]]\w+";
myStuff = new Queue<string>(Regex.Split(MyCmd,MyDelim));
但到目前为止,我上面的代码并没有产生预期的结果。
我的模式中哪些不正确?
答案 0 :(得分:1)
我相信你可以使用
var MyCmd = "print a+b;";
var MyDelim = @"([][\s;,+*/%=<>(){}-])";
var myStuff = Regex.Split(MyCmd,MyDelim).Where(p=> !string.IsNullOrWhiteSpace(p)).ToList();
输出:print
,a
,+
,b
,;
请注意,([][\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());