我正在尝试匹配只有一个下划线的字符串。Match当前正在查找lastname_firstname和lastname_firstname_middleinitail。我只想返回lastname_firstname并排除其他所有内容。
我试过-match "._." ".(_)." "._{1}" -like "*_*"
也有同样的问题。
下面是我的代码中具有-match的部分
$newUsers = Get-ADUser -SearchBase "CN=Users,DC=atlantic,DC=county" -Filter {WhenCreated -ge $date7DaysAgo} | Where-Object {$_.name -match "._."}
3条答案
按热度按时间pcrecxhr1#
我建议您使用LDAP执行部分过滤,以减少数据集,使代码更高效。
(name=*_*)
只会搜索name
属性中至少包含一个_
的用户,不包括那些没有_
的用户。对于第二层过滤,
^[a-z]+_[a-z]+$
将确保名称只有一个_
,但也只有从a
到z
的字符,如果你需要更包容,即。名称可以是0
到9
,您可以使用^[a-z0-9]+_[a-z0-9]+$
。z9gpfhce2#
让我补充一下Santiago's helpful answer,这是您特定问题的最佳解决方案,并回答您问题标题所暗示的“一般”问题:
我如何测试字符串是否包含给定字符的 * 精确N* 次出现,对于N >= 0?
注意事项:
*
-replace
"[^$char]"
使用regex实际上删除了除感兴趣的字符之外的所有字符,只留下一个由感兴趣的字符的示例组成的字符串,其长度意味着出现次数。-eq
替换为-le
/-lt
和-ge
/-gt
可选,直接调用
[regex]::Matches()
.NET API:为了完整起见:**如果N等于1或N是 * 固定的 ,或者您需要 * 至少-N 个逻辑,并且您不介意更复杂的regexes增加的复杂性,您也可以使用
-match
**如下所示:-
。[...]
中,即使对于_
来说这不是严格必要的。*固定 * N值> 1的示例;请注意,正则表达式的部分所需的显式重复(通过
\1
反向引用稍微减轻)使得这对于较大的N值是不切实际的:At-least-N逻辑大大简化了正则表达式:
边缘情况N是0是最容易处理的,因为你只需要确保 no
_
存在,这很容易用-notmatch
来做到:8yparm6h3#
Where-Object {$_.name -match "_.*?_"}
将检查输入字符串中是否有2个或更多下划线,但您需要的是相反的。因此,您可以使用NOT运算符反转$_.name -match "_.*?_"
的输出: