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

时间:2015-10-22 09:56:14

标签: c# regex string split delimiter

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

例如,从字符串if(a>b) write(a);我想获得if(a>b,{{ 1}},)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");"itis(因为空格是分隔符),但是positive"。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

匹配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

答案 1 :(得分:1)

我建议您使用以下正则表达式进行匹配而不是拆分。

@"(?:""[^""]*""|\w|[^\w\s])+"