【问题标题】:Split string based on specific characters根据特定字符拆分字符串
【发布时间】:2014-08-08 10:40:17
【问题描述】:

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

例如:

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

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

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

在 C# 中是否有更快、更有效的方法来完成此任务?

谢谢!

【问题讨论】:

  • 使用正则表达式。
  • 你有没有尝试过?您可以检查逗号 2 索引之前的字符是否为 `\\`。
  • 是的,我可以这样做,但正如我所提到的,它对于长字符串效率不高。我想知道是否有更聪明的方法来做到这一点。
  • 虽然我对您的问题有一个大致的了解,但对我来说仍然有些模棱两可。您需要如何拆分 aa\\\,bbaa\\\\,bb 之类的字符串? (这些是有效的案例吗?)
  • @John,不幸的是,您编辑的答案并没有明确解释您需要如何处理像 aa\\\,bbaa\\\\,bb 这样的字符串——请准确说明拆分这两个字符串的结果应该是什么(或者这两个字符串是否可能或有效作为输入......)

标签: c# string list substring


【解决方案1】:

这个正则表达式可以工作:

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

基本上,它会根据您的要求对每个逗号进行拆分,除了前面有两个反斜杠的逗号。

这是编写代码的另一种方式,可为您提供一些 cmets 以供将来维护:

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();

【讨论】:

  • 谢谢!这正是我一直在寻找的。让我看看它是否有效。
  • 我正在尝试将拆分字符串添加到列表(不是数组)。您将如何更改此行以适应此:string[] parts = re.Split(input);
  • 更新答案,见底部。
【解决方案2】:

一个好的方法是使用带有negative lookbehind 的常规表达式。

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"]

(?&lt;!\\) 是一个否定的lookbehind,这意味着下一个字符只有在前两个不是\\ 时才匹配。

【讨论】: