我有文本表:

   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

我想匹配所有数字,第一列中的数字除外。
我尝试使用否定性后向失败,但未成功:
(?<!^)[\d.E-]+

如何匹配除第一栏中的数字以外的所有数字(13.5、14、14.5、15、15.5)?

最佳答案

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

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

如果您只想在数据为数字时匹配那些数字,则可以使用
    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);

参见C# demo
-?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?浮点/整数编号regex为explained here

模式详细信息
  • (?m)-一种多行修饰符,使^匹配行
  • 的开始
  • (?<!^[\p{Zs}\t]*)-如果字符串的开头紧跟在当前位置左边的ogt_rli的后面,则字符串后面有0+个水平空格字符,则负向后搜索将使匹配失败
  • (?<=[\p{Zs}\t])-在
  • 之前需要水平空白的正向后视
  • -?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?-整数/浮点数正则表达式:
  • -?-可选的- char
  • [0-9]*-0 +数字
  • \.?-可选的. char
  • [0-9]+-1个以上数字
  • (?:[eE][-+]?[0-9]+)?-可选序列:
  • [eE]-一个eE char
  • [-+]?-可选的-+ char
  • [0-9]+-1个以上的数字。
  • 关于c# - 如何跳过栏目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48440856/

    10-13 06:08