【问题标题】:C# How to select any character if line starts with " *:"如果行以“ *:”开头,C#如何选择任何字符
【发布时间】:2019-08-08 08:00:38
【问题描述】:

我已经使用 readline 方法读取了一个文本文件。

var txtfile = File.readlines([Filepath])
.where(s => s.startswith(" U:"));

选择任何字母有诀窍吗? 类似这样的伪代码

s.startswith(" *:");

那是因为我的驱动器名称不断变化。 请注意,它必须是字母的确切顺序。 谢谢!

【问题讨论】:

  • 在您的示例中,您希望用多少字符代替 *
  • 可以将每一行转换成字符串,然后检查该行是否包含字符或者是== "*:"。
  • 只有一个字母而不是 *
  • 为什么开头有空格?
  • 因为DOS生成的.txt文件是这样生成的,所以问MS。

标签: c# readlines system.io.file


【解决方案1】:

您可以使用下面的正则表达式。

.Where(s => Regex.Match(s,@"^\s.{1}:.*").Success);

这是对该正则表达式的简短解释。

^ - 行首

\s - 空格

.{1} - 任何字符恰好出现一次

: - 匹配分号

.* - 0 个或多个字符

【讨论】:

  • 你能解释一下吗?
  • 谢谢!这正是我想要的!我该如何结束这个问题?
  • @V.Hunon 您不需要关闭问题。由于您已经将我的帖子标记为答案,所以一切都很好。很高兴我能帮上忙。
【解决方案2】:

这个怎么样?如果行的第一个字符是空格 ( ) 而第三个字符是冒号 (:)。那么中间可以有任意字符。

s[0] == ' ' && s[2] == ':'

正如 cmets 中所指出的,上述内容并非 100% 完成。这是更完整的代码行:

.where(s => s.Length >= 3 && s[0] == ' ' && s[2] == ':');

此代码添加了s.Length >= 3 条件,以确保字符串中至少有 3 个字符。如果您尝试访问不存在索引处的字符,您将获得IndexOutOfRangeException


性能

这是为了满足您的要求的最佳性能条件。可以对查询进行额外的优化,但这总是比正则表达式快得多。这也与其他答案中的正则表达式 100% 等效,但要快得多。

【讨论】:

  • 虽然这将是最高效且没有大惊小怪的解决方案,但应该注意它是最不健壮的。如果出现文件末尾少于 3 个字符、空白行或 crlf 的情况,则会引发异常。所以应该添加额外的检查
【解决方案3】:
s.Substring(2, 1) == ":"

例如:

" e:".Substring(2, 1) == ":" // will return true

【讨论】:

  • 这个解决方案不检查开头是否有空格。
【解决方案4】:

你可以使用VB的Like operator。如果您使用的是 .NET Core,则需要安装 Microsoft.VisualBasic package。如果您使用的是 .NET Framework,则需要对 Microsoft.VisualBasic.dll 的引用。

using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;

.Where(s => LikeOperator.LikeString(s, " [A-Z]:*", CompareMethod.Text))

【讨论】:

  • 为了获得更好的答案,请尝试在您的代码中添加一些解释。
  • @M.R.添加说明?
猜你喜欢
  • 2012-07-05
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多