正则表达式省略 UPN 或 displayName 中的可选前缀
Posted
技术标签:
【中文标题】正则表达式省略 UPN 或 displayName 中的可选前缀【英文标题】:RegEx omit optional prefix in UPN or displayName 【发布时间】:2022-01-04 13:09:35 【问题描述】:我试图只获取“非个性化用户名”,包括其号码或姓氏。 要添加更多细节,我想完成以下操作: 如果有一个@-Symbol,把那个@-Symbol 前面的所有东西都给我,否则给我整个字符串。 另外,如果有一个点“。”在里面,把那个点之后的所有东西都给我。
假设我有以下 userPrincipalNames 和/或 displayNames 字符串:
nonpersonalizedusername004
nonpersonalizedusername019@domaina.local
prefixc.nonpersonalizedusername044@domaina.local
nonpersonalizedusername038@domainb.local
prefixa.nonpersonalizedusername002@domaina.local
prefixb.nonpersonalizedusername038@domainb.local
givenname.surname
givenname.surname@domaina.local
到目前为止我得到的是这个表达式:
^(?:.*?\.)?(.+?)(?:@.*)?$
但这只有在字符串中有@-Symbol 并且“前缀”-Dot 或者既不是Dot 也不是@-Symbol 时才有效。 如果有一个@-Symbol,但没有前缀点,我只会从最后得到那个“本地”部分。
https://regex101.com/r/1aflGH/1
【问题讨论】:
那么,^(?:[^.@]*\.)?([^@]+?)(?:@.*)?$
? regex101.com/r/lZkFv6/2
没有惰性量词:^(?:[^@.]*\.)?([^@]+)(?:@.*)?$
对,它只是保留了 OP 的变体。
【参考方案1】:
你可以使用
^(?:[^@.]*\.)?([^@]+)(?:@.*)?$
请参阅regex demo。当针对单个多行字符串运行测试时,\n
被添加到 regex101 的否定字符类中。
详情:
^
- 字符串开头
(?:[^@.]*\.)?
- 除@
和.
和.
之外的任何零个或多个字符的可选序列
([^@]+)
- 第 1 组:@
char 以外的一个或多个字符
(?:@.*)?
- @
的可选序列,然后是该行的其余部分
$
- 字符串结束。
【讨论】:
按预期工作。非常感谢!事实上,我认为,我可以按照我在最初问题中提供的方式使用可选的非 Capturegroup+Capture+non-Capture 构建一个表达式。【参考方案2】:您可以选择重复匹配直到 @ 之前的最后一个点,然后捕获其余的直到第 1 组中的 @。
^(?:[^@.]*\.)*([^@.]+)
模式匹配:
^
字符串开始
(?:
非捕获组
[^@.]*\.
可选择重复匹配除@
或.
之外的任何字符,然后匹配.
)*
关闭非捕获组并可选择重复
(
捕获第 1 组
[^@.]+
)
关闭第一组
Regex demo
Powershell 示例
$s = @"
nonpersonalizedusername004
nonpersonalizedusername019@domaina.local
prefixc.nonpersonalizedusername044@domaina.local
nonpersonalizedusername038@domainb.local
prefixa.nonpersonalizedusername002@domaina.local
prefixb.nonpersonalizedusername038@domainb.local
givenname.surname
givenname.surname@domaina.local
"@
Select-String '(?m)^(?:[^@.\n]*\.)*([^@.\n]+)' -input $s -AllMatches | Foreach-Object $_.Matches | Foreach-Object $_.Groups[1].Value
输出
nonpersonalizedusername004
nonpersonalizedusername019
nonpersonalizedusername044
nonpersonalizedusername038
nonpersonalizedusername002
nonpersonalizedusername038
surname
surname
【讨论】:
在 regex101.com 上运行良好,但我无法在 Powershell 中运行:/ @BaBa 我认为它可以在 Powershell 中工作,请参阅 this example 如果您有多个字符串,您还可以使用多行修饰符添加(?m)^(?:[^@.]*\.)*([^@.]+)
以上是关于正则表达式省略 UPN 或 displayName 中的可选前缀的主要内容,如果未能解决你的问题,请参考以下文章