【发布时间】:2019-11-13 23:19:57
【问题描述】:
一个应用程序生成一个平面文件,其中每一行代表要导入另一个应用程序的数据。数据的类型与这个问题无关,但假设第一行是一串数字“0123456789”,并且每列的分隔符是不同的宽度。例如,我必须将字符串拆分为不同长度的数组,例如1,2,3,4 给予;
0
12
345
6789
以下使用 Regex.Split(s,s) 的代码对此进行了测试;但是任何人都可以解释为什么当我期望 4 时字符串被分成 6 组?
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
string data = "0123456789";
string splitPattern = "^";
for(int x = 1; x < 5; ++x) {
splitPattern += string.Format("(.{{{0}}})", x);
}
string[] processedData = Regex.Split(data, splitPattern);
Console.WriteLine($"Using {splitPattern} to split {data} yields {processedData.Length} results.");
foreach(string d in processedData) {
Console.WriteLine(String.Format("[{0}]", d));
}
}
}
运行此代码会产生以下打印行;
Using ^(.{1})(.{2})(.{3})(.{4}) to split 0123456789 yields 6 results.
[]
[0]
[12]
[345]
[6789]
[]
实际上,数据包括文本、数字和标点符号。此外,列的长度不是递增的,但我被拆分的方式难住了。
编辑
感谢您的回答和 cmets。我不认为这与C# Regex.Split: Removing empty results 重复,因为用户实际上编辑了他们的问题以解释它与他们的正则表达式模式有关。我现在明白我注意到的行为是意料之中的,在考虑之后,明白为什么会这样。 Regex.Split(data, splitPattern) 中的模式表示分隔符应该在哪里。所以如果模式匹配开始(和结束),那么一个空字符串就是匹配的结果before(和after)。
在这种情况下,我更喜欢 Split 而不是 Match,因为它返回一个简单的 string[] 而不是 Match。
【问题讨论】:
-
看起来您实际上想要
Regex.Match的模式,而不是Regex.Split,请参阅 ideone.com/8tuw6k