c# - 如何根据内容拆分字符串?

标签 c# regex string split delimiter

我正在尝试解析一个字符串并用一些定界符将其拆分,也包括定界符。

例如,从字符串 if(a>b) write(a); 我想得到 if,(,a,>,b,),write,(,a,),;

这是我尝试过的:

string pattern = "(" + String.Join("|", delimiters.Select(d =>Regex.Escape(d)).ToList()) + ")";
List<string> result = Regex.Split(line, pattern).ToList();

它可以工作,但在某些情况下会失败。如果我有字符串 if(a>0) write("it is positive"); 我不想得到 "it,is,positive"(因为空格是定界符),但是"it is positive"。我该怎么做?

最佳答案

可以使用已知的正则表达式来匹配 C 字符串:

"[^"\\]*(?:\\.[^"\\]*)*"

参见 regex demo

要将其合并到您的代码中,您只需将正则表达式添加到分隔符列表中,但您需要将其作为捕获组中的第一个替代项。

var delimiters = new List<string> { " ", "(", ")", ">", "<", ",", ";"};
var line = "if(a>b) write(\"My new result\")";
var escaped_delimiters = new List<string>();
escaped_delimiters.Add(@"""[^""\\]*(?:\\.[^""\\]*)*""");
escaped_delimiters.AddRange(delimiters.Select(d => Regex.Escape(d)).ToList());
var pattern = "(" + String.Join("|", escaped_delimiters) + ")";
var result = Regex.Split(line, pattern).Where(x => !String.IsNullOrWhiteSpace(x)).ToList();

参见 IDEONE demo

如果你不需要空元素,使用

List<string> result = Regex.Split(line, pattern).Where(x => !string.IsNullOrWhiteSpace(x)).ToList();

结果会是

enter image description here

关于c# - 如何根据内容拆分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33278242/

相关文章:

c# - virtual、abstract、override 关键字的排序

c# - 替换字符串中第一次出现的模式

javascript - 如何验证电子邮件地址与网站域名是否匹配?

java - java中使用正则表达式获取数据

c# - 如何从自定义授权策略向客户端发送有意义的错误

C# 缓存过期不起作用

javascript - 将 emojione img html 标签转换回 unicode

c++ - 错误 : invalid operands of types ‘const char [35]’ and ‘const char [2]’ to binary ‘operator+’

c# - 如何正确地将字符串转换为单词和标点符号列表?

c - printf 打印超过数组的大小