正则表达式组倒序
Posted
技术标签:
【中文标题】正则表达式组倒序【英文标题】:Regular Expression group reversed order 【发布时间】:2015-04-20 05:58:41 【问题描述】:我正在阅读一个非常混乱的文件,格式很少(如果有的话)。我正在寻找以下两个我工作正常的。
姓名(名字和姓氏)工作 电子邮件地址(不同类型(例如 .edu .net .com)也可能有其他类型。)工作 员工编号(两个大写字母后跟 5 个数字值,然后是与第一个相同的两个字母但相反)不工作我目前拥有的员工正则表达式代码:
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])[0-9]5\2\1
。数据之间是否有空格/分隔符/您能提供一些示例数据吗?
所以我不会尝试完全在正则表达式中执行此操作。也许将所有匹配 2 个大写字母后跟 5 个数字的东西读入一个有索引的数组中,然后遍历该数组并使用子字符串尝试将它们与以下两个反转的字母匹配。
@johnLBevan 是的,我马上补充。虽然很乱。我将包括其中的一两行。
【参考方案1】:
试试这个:
/.*?([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(匹配 5)和 Capital1(匹配 4)的重复
\s+
- 空格显示员工 ID 的结尾
(\S+@\S+)
- @ 符号两侧的非空格字符组成电子邮件*
.*
- 这仅允许在字符串末尾出现垃圾。它不会匹配邮件,因为\S+
是贪婪的,但它会满足任何其他字符,因此也代表电子邮件的结尾。
* 注意:电子邮件正则表达式过于简单;应该足以满足您的需求,但这无法检查有效的电子邮件,因为围绕这些的规则很复杂。 延伸阅读:Using a regular expression to validate an email address
【讨论】:
谢谢,我还有两个问题。 (我猜真的有更多建议)所以,我目前正在分别阅读每个案例(姓名、电子邮件、员工编号),在您完成的一场比赛中返回这些所有案例会更好/更有效,还是我应该保留它们分离?我遇到的另一个问题是关于employeeNumber,当您捕获前两个大写字母时,您在该案例结束时如何引用它们,我认为我在您的示例中缺少/没有看到该部分。无论如何,非常感谢您的解释非常有帮助! 我想我现在可以看到了。是\5\4
吗?
是的,就是这样 - 计算左括号以获得匹配的顺序(忽略任何非捕获组;尽管在这种情况下没有。我学到了关于正则表达式的大部分知识玩这个游戏的一天 - regexcrossword.com
至于是分开做事还是一次做事,在不了解完整上下文的情况下很难说……我这样做的好处是你只看字符串一次,而不是一次每个项目,所以它应该更快。此外,如果您知道字段的顺序将是一致的(第一个、最后一个、员工、邮件),您将获得更多工作提示,并且可以轻松区分名字和姓氏,尽管两者共享一个模式。如果数据比这更混乱,那么单独处理每个字段可能会有优势。以上是关于正则表达式组倒序的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式 (.*) .* 就是这2种写法,有啥却别?分别代表啥含义?