如何跳过专栏?

Pab*_*blo 5 c# regex

我有文字表:

   13.5         0.12557         0.04243         -0.0073         0.00377
     14         0.12573            0.05        -0.00697         0.00437
   14.5         0.12623         0.05823        -0.00703           0.005
     15         0.12853          0.0686        -0.00627         0.00493
   15.5          0.1299         0.08073        -0.00533          0.0063
Run Code Online (Sandbox Code Playgroud)

在哪里我想匹配所有数字,除了第一列中的数字.我试图使用负面的lookbehind但没有成功:

(?<!^)[\d.E-]+
Run Code Online (Sandbox Code Playgroud)

如何匹配除第一列(13.5,14,14.5,15,15.5)之外的所有数字?

Wik*_*żew 2

请注意,如果您不关心数据验证,则可以在此处不使用正则表达式:

var results = line.Split(new[] {"\r", "\n"}, StringSplitOptions.RemoveEmptyEntries)
            .Select(v => v.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries).Skip(1))
            .SelectMany(x => x);
Console.WriteLine(string.Join(",",results));
// => 0.12557,0.04243,-0.0073,0.00377,0.12573,0.05,-0.00697,0.00437,0.12623,0.05823,-0.00703,0.005,0.12853,0.0686,-0.00627,0.00493,0.1299,0.08073,-0.00533,0.0063
Run Code Online (Sandbox Code Playgroud)

如果您只想在数据是数字时匹配这些数字,您可以使用

    var results2 = Regex.Matches(line, @"(?m)(?<!^[\p{Zs}\t]*)(?<=[\p{Zs}\t])-?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?")
            .Cast<Match>()
            .Select(m => m.Value);
Run Code Online (Sandbox Code Playgroud)

请参阅C# 演示

浮点-?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?/整数正则表达式在这里进行了解释

图案细节

  • (?m)- 一个多行修饰符,使^匹配从行开始
  • (?<!^[\p{Zs}\t]*)- 如果字符串开头紧接着当前位置左侧有 0+ 个水平空白字符,则负向后查找将导致匹配失败
  • (?<=[\p{Zs}\t])- 正向后查找,需要在 a 之前有一个水平空白
  • -?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?- 整数/浮点数正则表达式:
    • -?- 一个可选的-字符
    • [0-9]*- 0+ 位数字
    • \.?- 一个可选的.字符
    • [0-9]+- 1+ 位数字
    • (?:[eE][-+]?[0-9]+)?- 可选序列:
      • [eE]- 一个eE字符
      • [-+]?- 可选的-+字符
      • [0-9]+- 1+ 位数字。