以下是我一直在努力的正则表达式声明:
Match parsedRequestData = Regex.Match(requestData, @"^.*\[(.*)\]$");
这应该是通过以下电子邮件发送电子邮件:
2.3|[0246303@up.com]
为了澄清,此电子邮件来自SQL Server中的表。在那里有许多格式如下的电子邮件,正则表达式应该从括号内获取所有这些。但是,它匹配此行的整体而不是其中的内容。所以我的问题是,我的正则表达式语句是否有问题,或者我的代码中是否有我需要添加的内容?
答案 0 :(得分:1)
您的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 :(得分:1)
你的正则表达式没问题。您只需使用Group[1]
var email = Regex.Match("2.3|[0246303@up.com]", @"^.*\[(.*)\]$").Groups[1].Value;
答案 2 :(得分:1)
然而,它匹配整个这一行,而不是它内部的什么。
除非使用命名匹配捕获,否则匹配捕获组将被编入索引。
( )
括号集中任何内容的模式中规范顺序的匹配捕获。如果只有一个( )
,则会有两个索引组;如上所述,0和指定要捕获到N的项目中的1个。您只设置了一个( )
,因此您可以在匹配捕获组1 中找到所需的数据。组0具有非匹配捕获项以及匹配捕获数据。
如果有人为匹配捕获命名,例如(?<MyNameHere> )
,也可以通过Match.Groups["MyNameHere"].Value
访问该匹配。
建议你的模式远离答案
在模式中使用*
(零或更多)可能会有问题,因为它会显着增加解析器因回溯而花费的时间 false场景。
如果有人知道有文本可以找到,请不要告诉解析器零项目可能会在不可能的情况下发生,将其更改为+
一个或多个。这种微小的变化会极大地影响解析操作,包括时间和操作。
将^.*\[(.*)\]$
更改为^.+\[(.+)\]$
。
但是为了提高模式的效率,请关注字符[
和]
作为锚点的知识。
使用锚点的模式重组
^[^[]+\[([^\]]+)[\s\]]+$
为什么这种模式更好?因为我们会寻找“[”和“]”作为锚点。
让我们分解
^
- 模式的开头(硬锚)[^ ]+
这是一个集合符号,^
表示NOT。[^\[]+
因此,我们希望捕获不是+
的所有文本[
(一个或多个)。这告诉模式匹配文本中的锚[
。请注意,我们无需转义它,因为正则表达式解析器将集合[ ]
中的所有字符视为文字,因此[^[]
有效。 (要清楚这是匹配但不捕获文本锚点,因此我们不会在0索引上方的索引中找到此文本;仅在0中)。\[
我们的文字锚“[”字符。([^\]]+)
这是我们的匹配捕获,表示匹配此设置,其中任何字符有效但不是“]”。在这里我们必须逃避]因为否则它将表示我们集合的结束。[\s\]]+
我们知道文本的结尾会有空格和“]”字符,所以让我们在结束之前匹配(但不要捕获)任何空格和a的组合。$
我们的最终锚点,文件/缓冲区指示符的结尾(如果设置了正确的解析器规则,则为行)。