C#Substring Alternative – 在字符串后面的字符串中返回其余行

我有一些代码读取文本文件并将其设置为字符串。 文本文件的每一行都包含我试图提取的单独数据参数。 这是一个如何布置字符串/文本文件的小例子:

... part=XYZ quantity=123 weight=14 length=60 ... 

在给定的行上有“=”之后返回所有内容的好方法吗?

我目前使用子字符串工作,但我很好奇是否有更简洁的方法来获得相同的结果。 这是我目前的代码:

  strStart = partData.IndexOf("part=") + 5; strEnd = partData.IndexOf(" ", strStart); string partNum = partData.Substring(strStart, strEnd - strStart); 

额外的澄清

我将从文本文件中提取多个变量。 例如,根据上面的数据,我将提取4个变量:

partNum =“XYZ”

qty =“123”

wght =“14”

len =“60”

是的,你可以更简洁地做到这一点。

 string partNum = partData.Substring(partData.IndexOf("=") + 1); 

这使用了String.Substring的重载版本,它只接受一个参数,即字符串中的起始位置。 它从那一点继续到字符串的结尾。

显然,只有在您partData中存在等号partData ,但您发布的原始代码也是如此。

你也可以使用正则表达式来做到这一点; 它可以处理比简单的IndexOfSplit解决方案更复杂的情况,例如跳过=周围的空格或不匹配某些模式,或者一次提取单行中找到的所有组件。

 string partNum = Regex.Match(partData, @"=(.*)$", RegexOptions.Multiline).Groups[1].Value; 

对于简单的情况,正则表达式会更慢(例如只是在=上拆分),但如果你真的想要从中途复杂模式处理和提取数据,它将更有效,更简洁。

此外,通过检查匹配的Success属性,您可以validation数据是否符合预期的模式,而无需任何其他处理/validation逻辑。

这是一个示例,它为每个文本行提取=符号之前和之后的部分,该文本行使用字符串中的预期模式,并沿着路径修剪部分:

 for (Match match = Regex.Match(partData, @"^\s*([^=]+?)\s*=\s*(.*?)\s*$", RegexOptions.Multiline); match.Success; match = match.NextMatch()) { // this code runs for each line in your string which has the expected pattern string key = match.Groups[1].Value; string value = match.Groups[2].Value; } 

编辑: 这是一个小提琴 ,它确实显示了此代码如何与您的示例数据一起使用。

假设文本文件采用发布格式且包含数据参数,则另一种方法是读取文件内容并将内容投影到字典中,因为您已经知道参数名称,即。 “部分”,“数量”等……

 Dictionary param = File .ReadLines("path.to.file.txt") .Select(x => x.Split('=')) .ToDictionary(x => x[0], y => y[1]); 

然后可以通过键名访问内容,类似于您最初分配变量的方式:

 string partNum = param["part"]; 

或者,只需根据需要使用字典,而无需分配局部变量。

您可以使用拆分,它可以更容易阅读:

 string value = partData.Split('=', 2)[1]; 

请注意,如果线路上没有“=”,则可以抛出exception。

如果您使用,这将更加强大

 var parts = string.Split('=') 

谁知道是否有人决定在等号之前或之后放置一个空格? 这会破坏您现有的解决方案,因为它不会找到“part = XXX”。 通过拆分,您可以获得两侧的零件。