我有文字表:
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)之外的所有数字?
答案 0 :(得分: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
如果您只想在数据为数字时匹配那些数字,您可以使用
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]+)?
浮点数/整数正则表达式为explained here。
模式详情
(?m)
- 一个多行修饰符,使^
匹配行的开头(?<!^[\p{Zs}\t]*)
- 如果字符串的开头跟着0+水平空白字符后立即向当前位置的左侧显示,则会导致匹配失败的负面观察(?<=[\p{Zs}\t])
- 在-?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
- 整数/浮点数正则表达式:
-?
- 可选的-
字符[0-9]*
- 0+位数\.?
- 可选的.
字符[0-9]+
- 1+位数(?:[eE][-+]?[0-9]+)?
- 可选序列:
[eE]
- e
或E
字符[-+]?
- 可选的-
或+
字符[0-9]+
- 1+位。