根据特定字符拆分字符串

时间:2014-08-08 10:40:18

标签: c# string list substring

我想使用逗号(,)拆分字符串并将其添加到列表中。但是,如果逗号跟随2个反斜杠,则不适用。

例如:

aaa,aaa,aaa>>将字符串拆分为3>> (aaa) (aaa) (aaa)

aa\\,a,aaa>>将字符串拆分为2>> (aa\\,a) (aaa)

我意识到我可以通过逐个遍历字符使用子字符串来做到这一点,但我不认为它有效(特别是对于长字符串)。

在C#中使用更快更有效的方法来实现这一目标吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

这个正则表达式将起作用:

string input = @"aaa\\,aaa,aaa";
var re = new Regex(@"(?<!\\),");
string[] parts = re.Split(input);

基本上它表示要分割每个逗号,除了逗号前面有两个反斜杠,根据你的要求。

这里有一种不同的方式来编写代码,为您提供一些注释以供将来维护:

string input = @"aaa\\,aaa,aaa";
var re = new Regex(@"
    (?<!      # negative lookahead, ie. 'is not preceeded by'
        \\    # two backslashes
    )         # end of negative lookahead
    ,         # the comma to split on
    ", RegexOptions.IgnorePatternWhitespace);
string[] parts = re.Split(input);

要将字符串添加到现有列表,请执行以下操作:

list.AddRange(re.Split(input));

要构建新列表而不是数组,请执行以下操作:

List<string> = re.Split(input).ToList();

答案 1 :(得分:3)

一种好方法是使用negative lookbehind的常规epxression。

var test1 = @"aaa,aaa,aaa";
var test2 = @"aa\\,a,aaa";

var pattern = @"(?<!\\),";

Regex.Split(test0, pattern); // returns ["aaa", "aaa", "aaa"]
Regex.Split(test1, pattern); // returns [@"aa\\,a", "aaa"]

(?<!\\)是一个负面的后瞻,这意味着下一个字符仅匹配前两个字符不是\\

相关问题