正则表达式省略 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 中的可选前缀的主要内容,如果未能解决你的问题,请参考以下文章

Grafana _field 显示名称模式 - 范围或正则表达式

正则表达式之合法多项式的检验

mysql 正则表达式替换,把指定位置随机数替换成固定数字

String类 ~正则表达式

除三个句点(省略号)外的字母周围句点的正则表达式

如何使用正则表达式语法从给定列中的文本中删除“省略号”? [复制]