获取正确的正则表达式以在c#中打印出来

时间:2015-07-24 15:26:33

标签: c# regex

以下是我一直在努力的正则表达式声明:

Match parsedRequestData = Regex.Match(requestData, @"^.*\[(.*)\]$");

这应该是通过以下电子邮件发送电子邮件:

2.3|[0246303@up.com]

为了澄清,此电子邮件来自SQL Server中的表。在那里有许多格式如下的电子邮件,正则表达式应该从括号内获取所有这些。但是,它匹配此行的整体而不是其中的内容。所以我的问题是,我的正则表达式语句是否有问题,或者我的代码中是否有我需要添加的内容?

3 个答案:

答案 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)

  

然而,它匹配整个这一行,而不是它内部的什么。

除非使用命名匹配捕获,否则匹配捕获组将被编入索引。

  • Match.Groups [0] .Value是整场比赛;它显示所有匹配捕获和所有分组匹配的文本。
  • Match.Groups [{1-N}]。值是( )括号集中任何内容的模式中规范顺序的匹配捕获。如果只有一个( ),则会有两个索引组;如上所述,0和指定要捕获到N的项目中的1个。

您只设置了一个( ),因此您可以在匹配捕获组1 中找到所需的数据。组0具有非匹配捕获项以及匹配捕获数据。

如果有人为匹配捕获命名,例如(?<MyNameHere> ),也可以通过Match.Groups["MyNameHere"].Value访问该匹配。

建议你的模式远离答案

在模式中使用*或更多)可能会有问题,因为它会显着增加解析器因回溯而花费的时间 false场景。

如果有人知道有文本可以找到,请不要告诉解析器项目可能会在不可能的情况下发生,将其更改为+一个或多个。这种微小的变化会极大地影响解析操作,包括时间和操作。

^.*\[(.*)\]$更改为^.+\[(.+)\]$

但是为了提高模式的效率,请关注字符[]作为锚点的知识。

使用锚点的模式重组

^[^[]+\[([^\]]+)[\s\]]+$

为什么这种模式更好?因为我们会寻找“[”和“]”作为锚点。

让我们分解

  • ^ - 模式的开头(硬锚)
  • [^ ]+这是一个集合符号,^表示NOT。
  • [^\[]+因此,我们希望捕获不是+的所有文本[(一个或多个)。这告诉模式匹配文本中的锚[。请注意,我们无需转义它,因为正则表达式解析器将集合[ ]中的所有字符视为文字,因此[^[]有效。 (要清楚这是匹配但不捕获文本锚点,因此我们不会在0索引上方的索引中找到此文本;仅在0中)。
  • \[我们的文字锚“[”字符。
  • ([^\]]+)这是我们的匹配捕获,表示匹配此设置,其中任何字符有效但不是“]”。在这里我们必须逃避]因为否则它将表示我们集合的结束。
  • [\s\]]+我们知道文本的结尾会有空格和“]”字符,所以让我们在结束之前匹配(但不要捕获)任何空格和a的组合。
  • $我们的最终锚点,文件/缓冲区指示符的结尾(如果设置了正确的解析器规则,则为行)。