【问题标题】:C# - Save text into variableC# - 将文本保存到变量中
【发布时间】:2018-06-15 03:39:26
【问题描述】:

我想将 .txt 文件中的电子邮件地址保存到字符串变量中。这是我的代码:

String path = "C:\\Users\\test.txt";
string from;

var fro = new Regex("from: (?<fr>)");

using (var reader = new StreamReader(File.OpenRead(@path)))
{
    while (true)
    {
        var nextLine = reader.ReadLine();
        if (nextLine == null)
            break;

        var matchb = fro.Match(nextLine);

        if (matchb.Success)
        {
            from = matchb.Groups["fr"].Value;
            Console.WriteLine(from);
        }
    }
}

我知道matchb.Successtrue,但是from 将无法正确显示。恐怕这与转义序列有关,但我在互联网上找不到任何有用的东西。

文本文件可能如下所示:

LOG 00:01:05 processID=123456-12345 来自:test@test.org
LOG 00:01:06 processID=123456-12345 OK

【问题讨论】:

  • 看起来您忘记定义命名组模式,如果您需要匹配from: 之后的所有其余行,请尝试"from: (?&lt;fr&gt;.*)"。如果电子邮件只有 1 个或多个非空格,您可以使用 \S+。为确保存在@,您可以使用\S+@\S+ 而不是.*(在代码中,使用@"from: *(?&lt;fr&gt;\S+@\S+)")。
  • 你不应该使用c# keyword作为变量名。
  • @TobiasTheel:它只是一个 contextual 关键字,在许多情况下它可能是最合适的变量名。对于查询表达式中的上下文关键字,我会尽量避免使用以这种方式命名的变量在查询表达式中,否则我认为这不是一个重大问题。
  • @TobiasTheel:但是 OP 没有得到任何以 C# 关键字命名的变量。他有一个与 contextual 关键字同名的变量,并且他没有在查询表达式中使用它,所以我认为它没有问题。

标签: c# regex match


【解决方案1】:

您的(?&lt;fr&gt;) 模式定义了一个与空字符串匹配的命名组“fr”。

要使用一些值填充组,您需要定义组模式。

如果您打算匹配该行的其余部分,您可以使用.*。要匹配一系列非空白字符,请使用\S+。要匹配包含@ 的非空白字符序列,请使用\S+@\S+。这三种方法都适用于当前场景。

在 C# 中,它看起来像

var fro = new Regex(@"from: *(?<fr>\S+@\S+)");

请注意,@"..." 是逐字字符串文字,其中单个反斜杠定义文字反斜杠,因此您不必将其加倍。我还建议使用 * 量词来匹配电子邮件前的 0 个或多个空格。您可能想改用 \s*(匹配任何 0+ 空白字符)或 [\p{Zs}\t]*(仅匹配水平空白字符)。

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 2014-04-24
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多