[英]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);
}
}
}
如果您想简化/修改/探索表达式,它已在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.