我有一堆不同名称的目录,如下所示:
firstname lastname (123) 456 7890
firstname lastname (234) 567-8910
firstname lastname 345-678-9101
我尝试重命名每个目录,以保持名称与空格,但没有空格之间的数字如下:
firstname lastname 1234567890
firstname lastname 2345678910
firstname lastname 3456789101
这就是我现在要做的
$destination = "D:\test"
Get-ChildItem -Path $destination -Recurse -Directory |
Rename-Item -NewName { $_.name -replace '[()\s-]',''} -Verbose
##output##
firstnamelastname1234567890
firstnamelastname2345678910
firstnamelastname3456789101
这种方法可以工作,但不会在名字和电话号码之间留下空格。我尝试过其他正则表达式模式,但找不到针对数字的解决方案。有没有办法只针对数字之间的空格?
2条答案
按热度按时间cngwdvgl1#
您可以使用
参见regex demo
[^\w\s]*
-除单词和空白字符之外的任何零个或多个字符(\d+)
-捕获组1($1
指来自替换模式的该值):一个或多个数字\W*
-任何零个或多个非字字符...(?=[\d\W]*$)
-紧跟零个或多个非字或数字字符,直到字符串末尾。ncgqoxb02#
注意:这个答案是可以验证的,我相信它是有帮助的。如果你发现它有问题,请告诉我们。
为了用一个可能更容易概念化的解决方案来补充Wiktor Stribiżew's helpful answer:
这产生:
-replace '(?<=[\d ])[()-]+ *'
有效地移除(
、)
和-
的所有示例(指定为字符集[...]
;为安全起见,其中一个或多个(+
),以避免拼写错误),沿着可选的(*
),后跟空格-如果前面是((?<=...)
),则为数字(\d
)或空格。-replace
operator指定 replacement 操作数,则会将匹配替换为空字符串,从而有效地“删除"匹配。实际效果是所有数字最终都直接连接在一起。