如果行以“*:”开头,C# 如何 select 任何字符

C# How to select any character if line starts with " *:"

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

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

选择任意字母有技巧吗? 类似这样的伪代码

s.startswith(" *:");

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

这个怎么样?如果行的第一个字符是 space ( ),第三个字符是冒号 (:)。然后中间可以有任何字符。

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

正如评论中指出的那样,以上内容并未 100% 完成。这是更完整的一行代码:

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

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


性能

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

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

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

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

^ - 行首

\s - 空格

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

: - 匹配分号

.* - 0 个或更多字符

s.Substring(2, 1) == ":"

例如:

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

您可以使用 VB 的 Like operator. If you're using .NET Core, you need to install Microsoft.VisualBasic package。如果您使用的是 .NET Framework,则需要引用 Microsoft.VisualBasic.dll.

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

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