正则表达式组倒序
Regular Expression group reversed order
我正在阅读一个格式非常少(如果有的话)的非常混乱的文件。我正在寻找以下两个我已经正常工作的。
- 姓名(名字和姓氏)工作
- 电子邮件地址(各种类型(例如 .edu .net .com)也可能有其他地址。)working
- 员工编号(两个大写字母后跟 5 个数字值,然后是与第一个字母相同但相反的两个字母)NOT Working
我目前拥有的员工正则表达式代码:
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'
试试这个:
/.*?([A-Z][a-z]*)\s+([A-Z][a-z]*)\s+(([A-Z])([A-Z])[0-9]{5})\s+\(\S+@\S+).*/g
Regex101 演示:https://regex101.com/r/iB9vF2/2
- 匹配 1 = 名字
- 匹配 2 = 姓氏
- Match3 = 员工 ID
- Match4 =(忽略此;仅用于查找员工 ID)
- Match5 =(忽略此;仅用于查找员工 ID)
- 匹配 6 = 电子邮件
解释:
.*?
- 忽略名字前的任何垃圾
([A-Z][a-z]*)
- 名字以大写开头,后跟任意数量的小写字母
\s+
- 1 个或多个 spaces 标记名字的结尾
([A-Z][a-z]*)
- 姓氏在名字之后,并遵循相同的模式
\s+
- 姓氏以 space(s)
结尾
(([A-Z])([A-Z])[0-9]{5})
- 员工 ID 跟在姓氏之后,格式为 Capital1、Capital2,然后是 5 位数字,然后是 Capital2 (match5) 和 Capital1 (match4)
\s+
- space(s)显示员工id结尾
(\S+@\S+)
- @ 符号两边的非 space 字符构成电子邮件*
.*
- 这只允许字符串末尾出现垃圾。它不会匹配邮件,因为 \S+
是贪婪的,但它会迎合任何其他字符,因此也代表电子邮件的结尾。
* 注意:电子邮件正则表达式过于简单;应该足以满足您的需求,但这无法检查有效的电子邮件,因为围绕这些的规则很复杂。
延伸阅读:Using a regular expression to validate an email address
我正在阅读一个格式非常少(如果有的话)的非常混乱的文件。我正在寻找以下两个我已经正常工作的。
- 姓名(名字和姓氏)工作
- 电子邮件地址(各种类型(例如 .edu .net .com)也可能有其他地址。)working
- 员工编号(两个大写字母后跟 5 个数字值,然后是与第一个字母相同但相反的两个字母)NOT Working
我目前拥有的员工正则表达式代码:
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'
试试这个:
/.*?([A-Z][a-z]*)\s+([A-Z][a-z]*)\s+(([A-Z])([A-Z])[0-9]{5})\s+\(\S+@\S+).*/g
Regex101 演示:https://regex101.com/r/iB9vF2/2
- 匹配 1 = 名字
- 匹配 2 = 姓氏
- Match3 = 员工 ID
- Match4 =(忽略此;仅用于查找员工 ID)
- Match5 =(忽略此;仅用于查找员工 ID)
- 匹配 6 = 电子邮件
解释:
.*?
- 忽略名字前的任何垃圾
([A-Z][a-z]*)
- 名字以大写开头,后跟任意数量的小写字母
\s+
- 1 个或多个 spaces 标记名字的结尾
([A-Z][a-z]*)
- 姓氏在名字之后,并遵循相同的模式
\s+
- 姓氏以 space(s)
(([A-Z])([A-Z])[0-9]{5})
- 员工 ID 跟在姓氏之后,格式为 Capital1、Capital2,然后是 5 位数字,然后是 Capital2 (match5) 和 Capital1 (match4)
\s+
- space(s)显示员工id结尾
(\S+@\S+)
- @ 符号两边的非 space 字符构成电子邮件*
.*
- 这只允许字符串末尾出现垃圾。它不会匹配邮件,因为 \S+
是贪婪的,但它会迎合任何其他字符,因此也代表电子邮件的结尾。
* 注意:电子邮件正则表达式过于简单;应该足以满足您的需求,但这无法检查有效的电子邮件,因为围绕这些的规则很复杂。 延伸阅读:Using a regular expression to validate an email address