Regex.Match没有给出预期的结果

时间:2019-11-12 21:19:41

标签: c# regex

我在Visual Studio 2017中使用C#。我在字符串下面

inputvalue = "
    OrderId:009
    Email:Ardi1234@yahoo.com
    ProductId:X206"

以下代码应使用电子邮件地址

var email =  Regex.Match(input: inputvalue, 
                     pattern: @"Email\:\ (.+)$", 
                     options: RegexOptions.Multiline).Groups[1].Value;

我只想获取电子邮件地址。但结果是一个空字符串。我该怎么办?

4 个答案:

答案 0 :(得分:1)

也许有点设计过度,但是如果有不希望的空格,它将提取电子邮件地址:

(?is)\bEmail:\s*([^@]+@[^.]+\.[a-z0-9]{2,6}(?:\.[a-z0-9]{2,6})?)$

测试

using System;
using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        string pattern = @"(?is)\bEmail:\s*([^@]+@[^.]+\.[a-z0-9]{2,6}(?:\.[a-z0-9]{2,6})?)$";
        string input = @"OrderId:009
            Email:Ardi1234@yahoo.com
            ProductId:X206

            OrderId:009
                Email: Ardi1234@yahoo.co.uk
                ProductId:X206

            OrderId:009
                EMAIL: Ardi1234@yahoo.co.uk
                ProductId:X206";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

C# Demo


如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:0)

以下似乎有效:

var inputvalue = @"
OrderId:009
Email:Ardi1234@yahoo.com
ProductId:X206";

var email =  Regex.Match(input: inputvalue, 
                    pattern: @"Email:(.+)$", 
                    options: RegexOptions.Multiline).Groups[1].Value;
Console.WriteLine(email);
Ardi1234@yahoo.com

没有正则表达式

正则表达式很棒,但是这里有一种不用它们的方法。

var inputvalue = @"
OrderId:009
Email:Ardi1234@yahoo.com
ProductId:X206";

var email = inputvalue.Split()
    .FirstOrDefault(l => l.StartsWith("email:", ignoreCase: true, culture: CultureInfo.InvariantCulture))
    ?.Replace("email:", "",ignoreCase: true, CultureInfo.InvariantCulture);

Console.WriteLine(email);

输出:

Ardi1234@yahoo.com

答案 2 :(得分:-1)

您可以尝试:Email\:(.+)不清楚换行符输入字符串是否中断。

PS:非常有用的工具:https://www.regextester.com

答案 3 :(得分:-1)

我一直首选命名捕获组,因为它们避免用魔法数字填充代码。但是,代码的问题是,与希望匹配的数据相比,正则表达式中有额外的空间。无需在此处转义空格或冒号:

Regex.Match(input: inputvalue,
            pattern: @"Email:(?<eml>.+)$",
            options: RegexOptions.Multiline).Groups["eml"].Value;

我注意到您已将多行设置为true,因此$表示“行的末尾”而不是“整个输入的末尾”,因此可以正确捕获电子邮件地址,但它很可能包含尾随\r-注意为此,如果有问题

如果您的文件在冒号和电子邮件地址之间可能有一些空格,请考虑以下模式:

Regex.Match(input: inputvalue,
            pattern: @"Email: *(?<eml>.+)$",
            options: RegexOptions.Multiline).Groups["eml"].Value;

这将匹配冒号和电子邮件之间的“零个或多个空格”,但不会将其捕获到电子邮件组中

没有空格,正则表达式可以匹配空格:

enter image description here

使用空格,正则表达式可以匹配空格:

enter image description here

没有空格,正则表达式不能匹配空格:

enter image description here