C#Regex.Split:删除空结果

Yog*_*esh 30 c# regex split

我正在开发一个导入数千行的应用程序,其中每行都有这样的格式:

|* 9070183020  |04.02.2011    |107222     |M/S SUNNY MEDICOS                  |GHAZIABAD                          |      32,768.00 |
Run Code Online (Sandbox Code Playgroud)

我使用以下内容Regex将行拆分为我需要的数据:

Regex lineSplitter = new Regex(@"(?:^\|\*|\|)\s*(.*?)\s+(?=\|)");
string[] columns = lineSplitter.Split(data);

foreach (string c in columns)
    Console.Write("[" + c + "] ");
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:

[] [9070183020] [] [04.02.2011] [] [107222] [] [M/S SUNNY MEDICOS] [] [GHAZIABAD] [] [32,768.00] [|]
Run Code Online (Sandbox Code Playgroud)

现在我有两个问题.
1.如何删除空结果.我知道我可以用:

string[] columns = lineSplitter.Split(data).Where(s => !string.IsNullOrEmpty(s)).ToArray();
Run Code Online (Sandbox Code Playgroud)

但有没有内置的方法来删除空结果?

2.如何拆除最后一根管子?

谢谢你的帮助.
此致,
Yogesh.

编辑:
我认为我的问题有点误解.从来没有关于我如何做到这一点.这只是关于如何通过更改Regex上面的代码来实现它.

我知道我可以在很多方面做到这一点.我已经使用上面提到的代码和一个Where子句以及另一种方式(也是两倍以上)更快地完成了它:

Regex regex = new Regex(@"(^\|\*\s*)|(\s*\|\s*)");
data = regex.Replace(data, "|");

string[] columns = data.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)

其次,作为一个测试用例,我的系统可以在原始方法中在不到1.5秒的时间内解析92k +​​这样的行,在第二种方法中不到700毫秒,在实际情况下我将永远不会发现超过几千行,所以我认为我不需要考虑这里的速度.在我看来,在这种情况下考虑速度是过早优化.

我找到了第一个问题的答案:由于Split没有内置的选项,因此无法完成.

仍在寻找我的第二个问题的答案.

Jar*_*dek 43

Regex lineSplitter = new Regex(@"[\s*\*]*\|[\s*\*]*");
var columns = lineSplitter.Split(data).Where(s => s != String.Empty);
Run Code Online (Sandbox Code Playgroud)

或者你可以简单地做:

string[] columns = data.Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string c in columns) this.textBox1.Text += "[" + c.Trim(' ', '*') + "] " + "\r\n";
Run Code Online (Sandbox Code Playgroud)

不,没有选项可以删除RegEx.Split的空条目,就像String.Split一样.

你也可以使用比赛.