我想使用逗号(,)拆分字符串并将其添加到列表中。但是,如果逗号跟随2个反斜杠,则不适用。
例如:
aaa,aaa,aaa
>>将字符串拆分为3>> (aaa) (aaa) (aaa)
aa\\,a,aaa
>>将字符串拆分为2>> (aa\\,a) (aaa)
我意识到我可以通过逐个遍历字符使用子字符串来做到这一点,但我不认为它有效(特别是对于长字符串)。
在C#中使用更快更有效的方法来实现这一目标吗?
谢谢!
答案 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"]
(?<!\\)
是一个负面的后瞻,这意味着下一个字符仅匹配前两个字符不是\\
。