Windows UPN正则提取问题:命名组域名正常但用户名组无数据
解决Windows UPN正则命名组提取用户名的问题
我来帮你搞定这个问题~你提到的猜测是对的,问题根源确实和正则的匹配顺序、贪婪特性有关,导致用户名组无法捕获到内容。
问题分析
你要处理的是user@domain.local格式的UPN字符串,目标是用命名组分别提取用户名(@前的部分)和域名(@后的部分)。如果当前正则能拿到域名但拿不到用户名,大概率是你的正则匹配逻辑写反了,或者用了贪婪匹配导致用户名的字符被前面的匹配规则“吃掉”了。
举个反例,如果你的正则是类似这样的:
(?P<domain>.+)@(?P<username>.+)
这里的(.+)是贪婪匹配,会从字符串开头一直匹配到最后一个@的位置,把user@都归到domain组里,剩下的内容根本满足不了后面的@(?P<username>.+)规则,最终导致username组为空——这就是你说的“回到开头查找最后一个索引”的问题,贪婪匹配的特性会优先占满所有能匹配的字符,让后续组无字符可匹配。
正确的正则写法
调整匹配顺序和规则,用下面的正则就能准确捕获两个命名组:
(?P<username>[^@]+)@(?P<domain>.+)
规则解释:
(?P<username>[^@]+):命名组username,[^@]+表示匹配任意不是@的字符,直到遇到第一个@为止,完美锁定@前的用户名部分@:精确匹配分隔符@(?P<domain>.+):命名组domain,匹配@之后的所有剩余字符,也就是完整的域名部分
测试验证
比如输入jane.smith@example.local,用这个正则会得到:
username组:jane.smithdomain组:example.local
完全符合你的提取需求~
内容的提问来源于stack exchange,提问作者user1839601
相关产品推荐
相关产品推荐

