正则表达式组反转顺序

时间:2015-02-19 01:14:38

标签: c# regex regex-group

我正在阅读一个非常混乱的文件,格式很少(如果有的话)。我正在寻找以下两个我正常工作的。

  • 姓名(第一个和最后一个)正在工作
  • 电子邮件地址(不同类型(例如.edu .net .com)也可能有其他人。)工作
  • 员工编号(两个大写字母后跟5位数字,然后是与第一个相同的两个字母,但相反) 不工作

我目前为Employee正则表达式编写的代码:

string employeeNumber = @"(?<grp1>[A-Z]{2})[0-9]{5}[A-Z]{2}";

这会找到所需的值,但也会找到无效的员工编号,因为它实际上并没有按相反的顺序查找前两个大写字母。

我最终想要的是如何仅以相反的顺序使用<grp1>

有效员工编号 XY12345YX

的示例

我找不到任何类型的正则表达式组反转的好文档。任何想法都会很棒!

修改

这是我正在阅读的文本文档中的一行示例。

'Name list from PQP-97 system &%$ Bill Williams  MK12345KM bwilliams01@msn.com ^ %20% 
Fredericka Hanover GW22887WG freddie@verizon.net'

1 个答案:

答案 0 :(得分:2)

试试这个:

/.*?([A-Z][a-z]*)\s+([A-Z][a-z]*)\s+(([A-Z])([A-Z])[0-9]{5}\5\4)\s+\(\S+@\S+).*/g

Regex101演示:https://regex101.com/r/iB9vF2/2

  • Match1 =名字
  • Match2 =姓氏
  • Match3 =员工ID
  • Match4 =(忽略此;仅用于查找员工ID)
  • Match5 =(忽略此;仅用于查找员工ID)
  • Match6 =电子邮件

<强>解释

.*? - 忽略名字前的任何垃圾

([A-Z][a-z]*) - 名字以大写字母开头,后跟任意数量的小写字母

\s+ - 1个或多个空格标记名字的末尾

([A-Z][a-z]*) - 姓氏遵循名字,并遵循相同的模式

\s+ - 姓氏以空格终止

(([A-Z])([A-Z])[0-9]{5}\5\4) - 员工ID跟随姓氏,格式为Capital1,Capital2则为5位数,然后重复Capital2(match5)和Capital1(match4)

\s+ - space(s)显示员工ID的结尾

(\S+@\S+) - @符号两侧的非空格字符构成电子邮件*

.* - 这只是允许字符串末尾的垃圾。它与邮件不匹配,因为\S+是贪婪的,但它会迎合任何其他角色,因此也代表电子邮件的结尾。

*注意:电子邮件正则表达式过于简单;应该足以满足您的需求,但这无法检查有效的电子邮件,因为围绕这些的规则很复杂。 进一步阅读:Using a regular expression to validate an email address