使用正则表达式将输入文本拆分为偶数块

时间:2016-01-17 13:10:33

标签: c# regex visual-studio

我已尽我所能找到这个问题的答案,我相信这很简单所以请原谅我。我有一个大写字母输入字符串,没有空格,没有换行符,只有来自A-Z的字母。 我正在尝试使用Regex.Split将其拆分为字母对。这是其他帖子和正则表达式信息所说的应该是

string[] letterPairs = Regex.Split(input, ".{0,2}");

这个字符串长40个字母,我找回了string[]个20个条目。但是,它们都是空字符串“”(不是null只是string.Empty)。 我在Microsoft Visual Studio 2015中使用C#。 使用Regex.Match然后循环匹配工作正常但不分裂。 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您不需要正则表达式,请使用以下内容:

public static IEnumerable<String> SplitByCount(String input, Int32 count)
{
    if (input == null) { throw new ArgumentNullException("input"); }
    if (count <= 0) { throw new ArgumentException("Count has to be positive.", "count"); }

    for (var i = 0; i < input.Length; i += count)
    {
        yield return input.Substring(i, Math.Min(count, input.Length - i));
    }
}

然后您可以通过以下方式调用:

var input = "HelloThisIsGoingToBeFunBut";
var result = SplitByCount(input, 2);

答案 1 :(得分:0)

实际上,如果我们检查指定要执行的Split(),这似乎正是我们所期望的: 您提供的正则表达式字符串作为其第二个参数指定分隔符,而不是您要分割的实际元素。分隔符之间的字符串确实都是空字符串。 如果您确实想使用regexp执行此任务,可以尝试使用Match()。但在这种情况下,使用简单的for循环可能会更好。

[MSDN Regexp.Split] https://msdn.microsoft.com/de-de/library/8yttk7sy%28v=vs.110%29.aspx

答案 2 :(得分:0)

想象一下你有

//              1       10        20        30        40
string input = "ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ";

当你使用.{0,2)正则表达式时,你使正则表达式引擎看起来是0到2(但由于量词是贪婪的,尽可能多的是)换行符以外的字符。因此,它会找到ABCD等,并使用这些值作为分隔符,因此,删除它们并将空字符串保留为结果数组元素。

现在,要强制元素保留在数组中,可以使用捕获机制:当模式用()括起时,以这种方式捕获的文本将输出为结果数组元素。

  

如果在 Regex.Split 表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。

然而,docs say

  

如果多个匹配彼此相邻,则会在数组中插入空字符串。例如,在单个连字符上拆分字符串会导致返回的数组在找到两个相邻连字符的位置包含一个空字符串。

  

如果在输入字符串的开头或结尾处找到匹配项,则在返回的数组的开头或结尾处包含空字符串。

因此,您还需要摆脱空元素(使用LINQ很容易)。

这是分成2个符号子串的解决方案:

var letterPairs = Regex.Split(input, "(.{0,2})").Where(p => !string.IsNullOrEmpty(p)).ToList();
Console.WriteLine("["+String.Join(",", letterPairs)+"]");
// => [AB,CD,EF,GH,IJ,AB,CD,EF,GH,IJ,AB,CD,EF,GH,IJ,AB,CD,EF,GH,IJ]

请参阅IDEONE demo

如果您需要[CD,GH,AB,EF,IJ,CD,GH,AB,EF,IJ]作为输出,请使用

var letterPairs = Regex.Split(input, ".{0,2}(.{0,2})").Where(p => !string.IsNullOrEmpty(p)).ToList();

如果您需要[AB,EF,IJ,CD,GH,AB,EF,IJ,CD,GH]作为输出,请使用

var letterPairs = Regex.Split(input, "(.{0,2}).{0,2}").Where(p => !string.IsNullOrEmpty(p)).ToList();