【问题标题】:Split a string into an array将字符串拆分为数组
【发布时间】:2015-09-13 11:17:02
【问题描述】:

我想将一个字符串拆分为一个子字符串数组。字符串由空格分隔,但空格也可能出现在子字符串内。并且拼接的字符串长度必须相同。

例子:

"a b aab bb  aaa" -> "a b", "aab", "bb ", "aaa"

我有以下代码:

var T = Regex.Split(S, @"(?<=\G.{4})").Select(x => x.Substring(0, 3));

但我需要参数化这段代码,按不同的长度(3、4、5 或 n)分割,我不知道该怎么做。请帮忙。

如果无法参数化正则表达式,完全 linq 版本可以。

【问题讨论】:

  • 要自动检测子串的长度吗?
  • 不,长度存储在变量中。

标签: c# regex linq


【解决方案1】:

您可以使用相同的正则表达式,但通过在字符串中插入所需的数字来“参数化”它。

在 C# 6.0 中,您可以这样做:

var n = 5;
var T = Regex.Split(S, $@"(?<=\G.{{{n}}})").Select(x => x.Substring(0, n-1));

在此之前你可以使用string.Format:

var n = 5;
var regex = string.Format(@"(?<=\G.{{{0}}})", n);
var T = Regex.Split(S, regex).Select(x => x.Substring(0, n-1));

【讨论】:

  • 字符串插值让生活更轻松。
  • 不应该改变Substring函数的参数吗?
  • @RichardSchneider 是的,这很容易成为我最喜欢的语言。
  • @RichardSchneider 另一方面,如果你想本地化插值字符串,一旦你用这个整洁的$ 东西替换了string.Format,那就太可怕了。
  • @UweKeim 我强烈怀疑插值字符串是否用于本地化。这对于没有将字符串呈现给最终用户的事情非常有用 - 例如。诊断、从元数据生成 SQL 等等。
【解决方案2】:

使用 LINQ 似乎很容易:

var source = "a b aab bb  aaa";

var results =
    Enumerable
        .Range(0, source.Length / 4 + 1)
        .Select(n => source.Substring(n * 4, 3))
        .ToList();

或者使用 Microsoft 的 Reactive Framework 团队的交互式扩展 (NuGet "Ix-Main") 并执行此操作:

var results =
    source
        .Buffer(3, 4)
        .Select(x => new string(x.ToArray()))
        .ToList();

两者都为您提供所需的输出。

【讨论】:

  • 谢谢,这段代码对我有用,var results = Enumerable .Range(0, (source.Length / (n + 1)) + 1) .Select(x =&gt; source.Substring(x * n, n - 1)) .ToArray();
【解决方案3】:

lookbehind (?&lt;=pattern) 匹配零长度字符串。要使用空格作为分隔符进行拆分,匹配必须实际返回一个“”(空格必须在主模式中,在 lookbehind 之外)。

长度 = 3 的正则表达式:@"(?&lt;=\G.{3}) "(注意尾随空格)

长度代码n

var n = 3;
var S = "a b aab bb  aaa";
var regex = @"(?<=\G.{" + n + @"}) ";
var T = Regex.Split(S, regex);

Run this code online

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 2012-02-22
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多