用条件拆分字符串

时间:2017-12-03 20:40:00

标签: c# string

给出一串:

"S1           =F  A1       =T  A2     =T  F3     =F"

如何拆分它以便结果是一个字符串数组,其中4个字符串,单个字符串将如下所示:

"S1=F"
"A1=T"
"A2=T"
"F3=F"

谢谢

1 个答案:

答案 0 :(得分:1)

您可以尝试将所有Name = (T|F)条件与正则表达式匹配,然后在 Linq 的帮助下删除每个匹配中的空格:

  using System.Linq;
  using System.Text.RegularExpressions;

  .. 

  string source = "S1 \t = F  A1 = T  A2 = T  F3 = F";

  string[] result = Regex
    .Matches(source, @"[A-Za-z][A-Za-z0-9]*\s*=\s*[TF]")
    .OfType<Match>()
    .Select(match => string.Concat(match.Value.Where(c => !char.IsWhiteSpace(c))))
    .ToArray();

  Console.WriteLine(string.Join(Environment.NewLine, result));

结果:

S1=F
A1=T
A2=T
F3=F

编辑:发生了什么事。第一部分是正则表达式匹配:

... Regex
    .Matches(source, @"[A-Za-z][A-Za-z0-9]*\s*=\s*[TF]")
    .OfType<Match>() ...

我们正试图找出带有模式的片段

[A-Za-z]      - Letter A..Z or a..z 
[A-Za-z0-9]*  - followed by zero or many letters or digits 
\s*           - zero or more white spaces (spaces, tabulations etc.)
=             - = 
\s*           - zero or more white spaces (spaces, tabulations etc.)
[TF]          - either T or F 

第二部分是匹配清算:对于找到的每个matchS1 \t = F我们希望获得"S1=F"字符串:

... 
.Select(match => string.Concat(match.Value.Where(c => !char.IsWhiteSpace(c))))
.ToArray();

我们在这里使用 Linq :对于匹配中的每个字符,我们会过滤掉所有空白区域(当且仅当它不是空格时才使用字符c):

match.Value.Where(c => !char.IsWhiteSpace(c))

然后将每个Concat的已过滤字符(IEnumerable<char>)组合回match并将这些字符串组织为一个数组( materialization ):

string