C# 使用c打印正确的正则表达式#
下面是我花了很长时间研究的正则表达式声明:C# 使用c打印正确的正则表达式#,c#,regex,C#,Regex,下面是我花了很长时间研究的正则表达式声明: Match parsedRequestData = Regex.Match(requestData, @"^.*\[(.*)\]$"); 这样做的目的是从下面的电子邮件中删除电子邮件: 2.3|[0246303@up.com] 为了澄清,此电子邮件来自SQL Server中的一个表。有很多电子邮件的格式都是这样的,正则表达式应该是从括号中获取所有这些内容的。然而,它匹配的是这条线的整体,而不是其中的内容。所以我的问题是,我的regex语句是否有问题
Match parsedRequestData = Regex.Match(requestData, @"^.*\[(.*)\]$");
这样做的目的是从下面的电子邮件中删除电子邮件:
2.3|[0246303@up.com]
为了澄清,此电子邮件来自SQL Server中的一个表。有很多电子邮件的格式都是这样的,正则表达式应该是从括号中获取所有这些内容的。然而,它匹配的是这条线的整体,而不是其中的内容。所以我的问题是,我的regex语句是否有问题,或者我的代码中是否有需要添加的内容?您的
regex
正在捕获组1中存储电子邮件地址。尝试如下引用组1:
parsedRequestData.Groups[1];
代码示例:
string requestData = "2.3|[0246303@up.com]";
Match parsedRequestData = Regex.Match(requestData, @"^.*\[(.*)\]$");
if (parsedRequestData.Success)
{
Console.WriteLine(parsedRequestData.Groups[1]);
}
结果:
0246303@up.com
你的正则表达式还可以。您只需使用
组[1]
var email = Regex.Match("2.3|[0246303@up.com]", @"^.*\[(.*)\]$").Groups[1].Value;
然而,它匹配的是这条线的整体,而不是其中的内容
除非使用命名的匹配捕获,否则将为匹配捕获组编制索引
- Match.Groups[0]。值是整个匹配项;它显示所有匹配捕获和所有分组匹配文本
- Match.Groups[{1-N}]。值是按模式中的规范顺序为括号集中的任何内容捕获的匹配项。如果只有一个
将有两个索引组;0,以及指定要捕获到N的项目中的1个()
()
,因此可以在匹配捕获组1中找到所需的数据。组0具有非匹配捕获项以及匹配捕获数据
如果将匹配捕获命名为(?)
,也可以通过match.Groups[“MyNameHere”].Value
访问匹配
远离答案的模式建议 在模式中使用
*
(零或更多)可能会有问题,因为它会由于回溯错误场景而显著增加解析器所需的时间
如果知道要找到文本,不要告诉解析器在不可能的情况下可能发生零项,将其更改为一项或多项。这一微小的变化会在时间和操作上极大地影响解析操作
将^.\[(.*)\]$
更改为^.+\[(.+)\]$
但是,为了提高模式的效率,重点关注字符[
和]
作为锚定的知识
模式重组以使用锚定
^[^[]+\[([^\]]+)[\s\]]+$
为什么这种模式更好?因为我们将寻找“[”和“]”作为锚
让我们把它分解一下
-模式的开始(硬锚)^
这是一个集合符号,其中[^]+
表示不存在^
因此我们希望捕获所有不是[^\[]+
的文本[
(一个或多个)。这告诉模式匹配文本中的锚定符+
。请注意,我们不必转义它,因为正则表达式解析器将集合[
中的所有字符视为文本,因此[]
是有效的。(需要明确的是,这是一个匹配项,但不捕获文本锚定,因此我们不会在0索引上方的索引中找到此文本;仅在0中)[^[]
我们的文字锚定“[”字符\[
这是我们的匹配捕获,它表示匹配此集合,其中任何字符都是有效的,但不是“]”。这里我们必须对“]”进行转义,否则它将表示集合的结束([^\]]+)
我们知道文本的结尾将有空格和“]”字符,所以让我们在结尾前匹配(但不是捕获)空格和a]的任何组合[\s\]]+
我们的最后一个锚点,文件/缓冲区指示符的结尾(如果设置了正确的解析器规则,则为行)$
x=x.Remove(x.Length-1).Substring(1+x.IndexOf('['));
您通过不标记答案来保持此问题的开放性…您遇到了什么问题吗?