分割具有多个分割字符串的文本文件

时间:2019-07-08 13:51:51

标签: c# regex

我正在尝试读取一个文本文件,该文件包含空格和双引号,并且没有一种简单的方法来识别这种情况,我只是想检查一下是否可以使用预定义的正则表达式来实现否则我需要开始进行自定义拆分

这是字符串

  

“ myfile-one two”“ 1” 3 1453454.00 -134557.63 585.0 24444.8 -999“ NULL”“” 45.60“” 67°32'5.23455“ N 54°56'65.3454” W“ NULL” 6.00

输出应为

myfile-one two
1
3
1453454.00
-134557.63
585.0
24444.8
-999
NULL
45.60

67°32'5.23455"N
54°56'65.3454"W
NULL
6.00

下面的代码尝试首先拆分为空格定界符,并且即使在双引号内也进行此拆分,并作为单独的条目进行

char[] space = new Char[] { ' ' };

string[] data = comp.Split(space, StringSplitOptions.RemoveEmptyEntries);

2 个答案:

答案 0 :(得分:4)

您可以匹配没有用空格括起来的双引号之间的所有子字符串,并将其中的内容捕获到一个命名组中,或者匹配任何1个以上非空格字符并捕获到以相同方式命名的组中并使用

var results = Regex.Matches(str, @"(?<!\S)""(?<o>.*?)""(?!\S)|(?<o>\S+)")
                .Cast<Match>()
                .Select(m => m.Groups["o"].Value)
                .ToList();

请参见regex demo

模式详细信息

  • (?<!\S)-当前位置左侧必须紧跟空格或字符串开头
  • "-双引号
  • (?<o>.*?)-组“ o”:除换行符外的任何0+个字符,尽可能少
  • "-双引号
  • (?!\S)-当前位置右边必须紧跟空格或字符串结尾
  • |-或
  • (?<o>\S+)-组“ o”:任意1个以上非空格字符。

.NET允许在一个正则表达式模式内使用名称相同的组,从而将找到的值累加到您可以通过.Select(m => m.Groups["o"].Value)“收集”的相应内存缓冲区中。

答案 1 :(得分:0)

由于正则表达式会严重影响性能,并且所描述的场景非常简单,因此我想提供一个简短,快速且无正则表达式的解决方案,该解决方案仅使用string成员。此外,无正则表达式的方法到目前为止更具可读性和鲁棒性。

// The escaped input string
var input = @"""myfile-one two"" ""1"" 3 1453454.00 -134557.63 585.0 24444.8 -999 ""NULL"" """" 45.60 """" 67°32'5.23455""N 54°56'65.3454""W ""NULL"" 6.00 ";

List<string> cleanedInputTokens = input
  .Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries)
  .Select(token => token.Trim('"'))
  .ToList();

该算法首先将输入分为令牌,然后修剪指定字符的前导和尾随。因为Split(Char[], StringSplitOptions)Trim(Char[])都接受一个字符数组,所以该模式也是可扩展且灵活的。