【问题标题】:How to remove whitespace between numbers only?如何仅删除数字之间的空格?
【发布时间】:2020-12-06 20:59:24
【问题描述】:

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

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

这种方法有效,但不会在名字姓氏和电话号码之间留下空格。我一直在尝试其他正则表达式模式,但找不到目标数字的解决方案。有没有办法只针对数字之间的空白?

【问题讨论】:

  • 你可以使用这样的正则表达式 (?<=\d|\))[- ](?=\d) regex101.com/r/4YR8ft/1 实际上.. 看起来你也想删除括号,所以需要做更多的工作。但关键是您可以使用前瞻/后瞻。
  • 上面的正则表达式只会匹配-space,而不是括号。如果这对你不起作用,你可以试试这个:(?<=\d)[()\s-]|[()\s-](?=\d)

标签: regex powershell


【解决方案1】:

你可以使用

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

regex demo

详情

  • [^\w\s]* - 除单词和空格字符以外的任何零个或多个字符
  • (\d+) - 捕获组 1($1 指替换模式中的此值):一位或多位数字
  • \W* - 任何零个或多个非单词字符...
  • (?=[\d\W]*$) - 紧跟零个或多个非单词或数字字符,直到字符串结尾。

【讨论】:

    【解决方案2】:

    注意:这个答案确实有效,我相信它会有所帮助。如果您发现它有问题,请告诉我们。

    用一个可能更容易概念化的解决方案来补充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 (?&lt;=[\d ])[()-] ? 有效地删除了所有()-(指定为字符集,[...];为了安全起见,其中一个或多个(+)实例,以覆盖拼写错误),以及紧随其后的可选 (*) 空格 - 如果前面有 ((?&lt;=...)) 数字 (\d) 或空格。

    • 请注意,不为 -replace operator 指定 replacement 操作数会将匹配项替换为空字符串,因此有效地删除匹配项。

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

    请注意,假设()- 仅作为文件名的数字(电话号码)部分出现,如示例输入中所示;但是,- 作为姓氏的一部分得到了正确处理。

    【讨论】: