regex 如何只删除数字之间的空格?

lymnna71  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一堆不同名称的目录,如下所示:

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

这种方法可以工作,但不会在名字和电话号码之间留下空格。我尝试过其他正则表达式模式,但找不到针对数字的解决方案。有没有办法只针对数字之间的空格?

cngwdvgl

cngwdvgl1#

您可以使用

$_.name -replace '[^\w\s]*(\d+)\W*(?=[\d\W]*$)', '$1'

参见regex demo

    • 详细信息**
  • [^\w\s]*-除单词和空白字符之外的任何零个或多个字符
  • (\d+)-捕获组1($1指来自替换模式的该值):一个或多个数字
  • \W*-任何零个或多个非字字符...
  • (?=[\d\W]*$)-紧跟零个或多个非字或数字字符,直到字符串末尾。
ncgqoxb0

ncgqoxb02#

注意:这个答案是可以验证的,我相信它是有帮助的。如果你发现它有问题,请告诉我们。
为了用一个可能更容易概念化的解决方案来补充Wiktor Stribiżew's helpful answer

'firstname lastname (123) 456-7890', 
'firstname lastname (234) 567-8910',
'firstname last-name 345-678-9101'    -replace '(?<=[\d ])[()-]+ *'

这产生:

firstname lastname 1234567890
firstname lastname 2345678910
firstname last-name 3456789101
  • -replace '(?<=[\d ])[()-]+ *'有效地移除()-的所有示例(指定为字符集[...];为安全起见,其中一个或多个(+),以避免拼写错误),沿着可选的(*),后跟空格-如果前面是((?<=...)),则为数字(\d)或空格。
  • 有关正则表达式及其交互能力的详细说明,请参见this regex101.com page
  • 请注意,如果不为-replace operator指定 replacement 操作数,则会将匹配替换为空字符串,从而有效地“删除"匹配。

实际效果是所有数字最终都直接连接在一起。

相关问题