繁体   English   中英

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

[英]Regex.Match does not give expected result

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

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

下面的代码应该取email地址

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

我只想得到 email 地址。 但结果是一个空字符串。 我怎样才能做到这一点?

也许,有点过度设计,但如果有任何不需要的空格,它会提取 email 地址:

(?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# 演示


如果您想简化/修改/探索表达式,它已在regex101.com的右上角面板上进行了解释。 如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。


正则表达式电路

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

在此处输入图像描述

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

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

以下似乎有效:

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);

Output:

Ardi1234@yahoo.com

我一直更喜欢命名捕获组,因为它们避免用幻数填充代码。 代码的问题在于,与您希望匹配的数据相比,您在正则表达式中有额外的空间。 这里不需要转义空格或冒号:

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

我注意到您已将多行设置为 true,因此 $ 表示“行尾”而不是“整个输入的结束”,因此 email 地址被正确捕获,但它很可能包含尾随\r - 如果它会出现,请注意这一点一个问题

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

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

这将匹配冒号和 email 之间的“零个或多个空格”,但它们不会被捕获到 email 组中

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM