簡體   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