正则表达式提取UPN或displayName中去除可选前缀的目标用户名或姓氏
正则调整方案
问题根因
原有正则^(?:.*?\.)?(.+?)(?:@.*)?$ 出错的核心原因:
- 捕获组
(.+?)使用惰性匹配,且没有限制不能包含@字符 - 末尾的
(?:@.*)?是可选分组,正则引擎为了完成匹配会优先让可选分组不生效,当字符串没有前置.时,(.+?)会直接匹配整个字符串,包含@及后面的内容,导致提取错误。
修复后正则
如果规则2要求取第一个.之后的全部内容(符合给出的示例场景),使用:
^(?:.*?\.)?([^@]+)(?:@.*)?$
如果规则2要求取最后一个.之后的内容,把.*?改为贪婪匹配即可:
^(?:.*\.)?([^@]+)(?:@.*)?$
调整核心是把捕获组限定为[^@]+,只能匹配非@的字符,遇到@就会停止,强制触发后面的@.*分组匹配域名部分,不会出现捕获内容包含@的问题。
示例匹配验证
用给出的所有测试用例验证,第一个正则的捕获结果完全符合要求:
- 输入
nonpersonalizedusername004→ 捕获nonpersonalizedusername004 - 输入
nonpersonalizedusername019@domaina.local→ 捕获nonpersonalizedusername019 - 输入
prefixc.nonpersonalizedusername044@domaina.local→ 捕获nonpersonalizedusername044 - 输入
nonpersonalizedusername038@domainb.local→ 捕获nonpersonalizedusername038 - 输入
prefixa.nonpersonalizedusername002@domaina.local→ 捕获nonpersonalizedusername002 - 输入
prefixb.nonpersonalizedusername038@domainb.local→ 捕获nonpersonalizedusername038 - 输入
givenname.surname→ 捕获surname - 输入
givenname.surname@domaina.local→ 捕获surname
内容的提问来源于stack exchange,提问作者BaBa
相关产品推荐
相关产品推荐

