【问题标题】:Powershell RegEx assistancePowershell 正则表达式帮助
【发布时间】:2021-11-25 00:55:57
【问题描述】:

希望有人可以帮助我。 当前字符串:

$monthlist = @()
$monthlist = Get-ChildItem $place -Recurse -Directory -force `
| Where-Object { ($_.name -match '((\\0[1-9]|1[0-2])-(200[0-9]|20[1-4][0-9]|205[0-5]))') }

这会在 Powershell 中返回:

C:\temp\test\10-2021
C:\temp\test\12-2019
C:\temp\test\2019\12-2019
C:\temp\test\2020\11-2020

但不是:

c:\temp\test\08-2021 
c:\temp\test\09-2021

使用 https://regex101.com/https://regexr.com/ 他们都说上面列出的所有 6 个文件夹都应该匹配。

我需要正则表达式字符串中的\,因为还有几个文件夹,例如我不希望匹配的以下文件夹:

c:\temp\test\01-01-2021
c:\temp\test\05-25-2020

我在 RegEx 方面不是最好的,我希望有人能很快发现我的错误

【问题讨论】:

  • 删除第一个嵌套组开头的\\ - 路径分隔符不是文件名本身的一部分
  • 除此之外 - 不需要第二行末尾的反引号。只需将管道从第 3 行的开头移动到第 2 行的结尾。
  • @MathiasR.Jessen 如果我拉 \\ 然后正则表达式返回 10-01-2021 和 10-02-2021,我需要排除这些。
  • @topcity36 你不需要\\,你只需要将模式锚定在字符串的开头和结尾:$_.Name -match '^((0[1-9]|1[0-2])-(200[0-9]|20[1-4][0-9]|205[0-5]))$'
  • @MathiasR.Jessen sonuva....我可以发誓我以前尝试过。无论哪种方式,它都有效,感谢您的帮助。

标签: regex powershell


【解决方案1】:

第一组前面的\\ 阻止匹配以0 开头的名称。

如果您担心匹配较大字符串中的子字符串(例如 01-01-2021 中的 01-2021),请确保将模式锚定在 ^ 字符串开头和 $ 结尾-of-string 元字符:

... | Where-Object { ($_.name -match '^((0[1-9]|1[0-2])-(200[0-9]|20[1-4][0-9]|205[0-5]))$') }

【讨论】:

  • 如果我想从字符串中提取 \ 会是什么样子? Where-Object { ($_.name -match '^\\(((0[1-9]|1[0-2])-(200[0-9]|20[1-4][0-9]|205[0-5]))$)') }
  • 字符串永远不会包含\ - 它不是有效的文件名字符,您正在对文件名进行操作
  • 公平,但如果我使用 .fullname 它会有 \xxx\xxx\
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多