0

示例输入:

john@test.com johnny@myserver.com      joan@server.com

使用像这样的正则表达式,[a-z]+@[a-z]+.com我们可以在给定的输入字符串中找到所有邮件地址。注意:正则表达式被简化以使示例简单。

问题:有没有办法检查输入字符串的剩余部分(与模式不匹配)是否仅包含空格,以便我们可以测试每个邮件地址是否被模式重新识别?

4

1 回答 1

1

使用分组和捕获。

使用类似的正则表达式\s*([a-z]+@[a-z]+.com)\s*(注意额外的括号!重要!),然后而不是查看整个正则表达式匹配的内容,获取 matchresult 对象并检查其组和捕获。从此,您将不会收到一封电子邮件,而是收到所有已捕获电子邮件的列表(并由空格分隔)

编辑:

首先,查看MSDN 上的这篇文章,了解有关“组”和“捕获”的概述。

然后,请注意Regex.Match返回一个Match对象,它告诉您是否存在 a Success。但是,除了Success该对象的属性之外Match,还有一些其他属性,例如Capturesor Groups

的这两个属性Match是保存所有字符串的集合,这些字符串很好地被正则表达式中出现的任何“组”(括号)“捕获”。

根据您构建正则表达式的方式,Captures 和 Groups 的内容会有所不同,但您只需亲自查看它们,就应该清楚它们是什么/如何工作的。

例如:

regex: (aaa([b0-9]+)ccc([d0-9]+)eee\s*)*
input: "aaab123cccd456eee aaab789cccd123deee"

将产生 3 个组(因为有 3 组括号)和 6 个捕获(因为正则表达式匹配两个大字符串,小括号在每个大字符串中匹配两次)

groups:
   [0] captures: "aaab123cccd456eee ", "aaab789cccd123deee"
   [1] captures: "b123", "b789"
   [2] captures: "d456", "d123"

请注意,“大”括号中的“大”捕获中有一个空格,因为我\s*在其末尾包含了标记以说明分隔符。

于 2013-11-11T12:13:20.967 回答