【问题标题】:Read values from structured array of string从结构化的字符串数组中读取值
【发布时间】:2014-11-16 16:19:37
【问题描述】:

所以基本上我是从基于文本的文件中逐行读取到数组中。每行 = 新的数组元素。这个基于文本的文件是自动生成的,因此文件之间的结构是一致的。我想从数组元素中读取值。下面是我要阅读的一行示例。

;Basic settings: Layer height: 0.2 Walls: 0.8 Fill: 20

所以我想从(例如)数组元素 4 (gline[4]) 中提取层高度值、墙值和填充值。

最好的方法是什么?我在 C# 中使用 VS2012 编程。这些数字都是正数,但除此之外可以是任何大小。

这是我尝试过的代码,但我无法获取“0.2”或“0.8”作为数字。

Variables.gcodeLines = System.IO.File.ReadAllLines(Variables.FilePath);

var numbers = Regex.Split(Variables.gcodeLines[3], @"^\d+(.\d+){0,1}$").Where(s => s != String.Empty).ToArray();
MessageBox.Show("" + numbers[0] + " " + numbers[1]);

如果您确实提供了示例代码,请您解释一下它背后的基本原理。

提前致谢!

【问题讨论】:

  • 你试过什么?如果您还没有尝试过任何方法,您认为最好的方法是什么?
  • 我使用了一个 for 循环和 contains() 方法来查找我想要使用的数组中的行。我试过让 Regex.Match() 工作,但无济于事。这是最好的方法吗?
  • 您对输入有任何控制权吗?有一些方法可以使其在 .NET 端更容易解析。
  • 该文件由输出gcode到该文件的软件包创建。它的结构必须是普遍兼容的。我最近尝试使用 regex.split() 函数,但我在将 0.2 识别为数字时遇到了问题。这似乎只是一个过滤器问题。

标签: c# arrays string search filter


【解决方案1】:

我认为你想要的正则表达式是@"\d+(\.\d?)?"。而且你不想就此分裂,你想要比赛。

所以你想要的是:

var re = new Regex(@"\d+(\.\d?)?");
var matches = re.Matches(Variables.gcodeLines[3]);
var numbers = matches.Cast<Match>().ToArray();

首先,您需要Matches 而不是Split,因为Split 会给您以数字分隔的内容。这就是您使用Split 拆分逗号分隔列表的原因:它为您提供除逗号之外的所有内容。

另一方面,Matches 会为您提供包含数字的MatchCollection

正则表达式@"\d+(\.\d?)?" 表示:

a string of digits
optionally followed by a period and 0 or 1 digits

您必须转义句点,因为它是正则表达式世界中的特殊字符(匹配任何字符)。

【讨论】:

  • 非常感谢。我从来没有这样解释过。所以对于 0.25 我会使用 @"\d+(\.\d\d?)?" ?
  • @user3684557:如果你想匹配一个最多有两位小数的数字,你可以写@"\d+(\.\d{0,2})?"。也就是说,一个或多个数字可选地后跟一个句点和 0、1 或 2 个数字。所以“1”。将是有效的,“1.1”和“1.12”也是如此。
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多