Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c打印正确的正则表达式#_C#_Regex - Fatal编程技术网

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中)
  • \[
    我们的文字锚定“[”字符
  • ([^\]]+)
    这是我们的匹配捕获,它表示匹配此集合,其中任何字符都是有效的,但不是“]”。这里我们必须对“]”进行转义,否则它将表示集合的结束
  • [\s\]]+
    我们知道文本的结尾将有空格和“]”字符,所以让我们在结尾前匹配(但不是捕获)空格和a]的任何组合
  • $
    我们的最后一个锚点,文件/缓冲区指示符的结尾(如果设置了正确的解析器规则,则为行)

或对于单个已知匹配
x=x.Remove(x.Length-1).Substring(1+x.IndexOf('['));
您通过不标记答案来保持此问题的开放性…您遇到了什么问题吗?