【问题标题】:Regex for matching between 2nd quotation and file name?用于匹配第二个引号和文件名的正则表达式?
【发布时间】:2018-08-21 16:41:45
【问题描述】:

我有一个 powershell 脚本,它可以打开 CSV 文件并仅用文件名替换第二列完整文件路径。我可以在 powershell 中使用 -replace 函数,但是我没有办法显式匹配某些字符串,因为文件路径的长度和子目录的数量不同。

我需要帮助来使用正则表达式来匹配这样的字符串:

字符串:"1003,"\\ST12345\share$\SYSTEM\V1\1\2\1234.htm"

我要匹配:\\ST12345\share$\SYSTEM\V1\1\2\

所以我可以用空替换上面的内容(从而删除它)。另一个问题是共享可能有不同数量的目录,因此可能有 2 个反斜杠或可能有 4 个反斜杠,但总会有一个文件名,并且字符串总是以 \ 开头。

感谢您的帮助!

【问题讨论】:

  • "\\ST12345\share$\SYSTEM\V1\1\2\1234.htm" | Split-Path -Parent
  • 使用Import-Csv 并检查/修改相应列的值。

标签: regex powershell


【解决方案1】:

您可以使用以下模式:

(?<=,").*?(?=\d+\.htm)

你可以试试here


Powershell 演示:

$matches = '"1003,"\\ST12345\share$\SYSTEM\V1\1\2\1234.htm"' | Select-String -Pattern '(?<=,").*?(?=\d+\.htm)'
$matches.Matches.Value

打印:

\\ST12345\share$\SYSTEM\V1\1\2\

【讨论】:

  • 你是一个了不起的人。谢谢!
  • @user2242057 不客气 :) @Bill,当我按照你的建议尝试拆分路径时,结果也包含 1003,
  • 如果您使用 Import-Csv(推荐)而不是解析单个行(如 Ansgar Wiechers 所述),则不会。
【解决方案2】:

完全按照要求回答您的问题(即使您的输入字符串的" 不平衡):

PS> '"1003,"\\ST12345\share$\SYSTEM\V1\1\2\1234.htm"' -replace '(?<=")\\.+\\'
"1003,"1234.htm"
  • (?&lt;=") 是一个后向断言,它匹配文件路径之前的 ",但不将其包含在匹配项中。

  • \\.+\\ 匹配(转义的)\,后跟任何非空字符序列 (.+),后跟 \。 .NET 正则表达式匹配默认是 greedy,所以通过 last \ 的所有内容都匹配,有效地删除了文件的目录路径。

【讨论】:

  • @user2242057:很高兴听到它有帮助;我的荣幸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多