正则表达式用于第二引号和文件名之间的匹配?

时间:2018-08-21 16:41:45

标签: regex powershell

我有一个Powershell脚本,可以打开CSV文件,并仅用文件名替换第二列的完整文件路径。我可以在Powershell中使用-replace函数,但是由于文件路径的长度以及子目录的多少而异,因此我无法明确匹配某些字符串。

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

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

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

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

谢谢您的帮助!

2 个答案:

答案 0 :(得分: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\

答案 1 :(得分:0)

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

PS> '"1003,"\\ST12345\share$\SYSTEM\V1\1\2\1234.htm"' -replace '(?<=")\\.+\\'
"1003,"1234.htm"
  • (?<=")是一种在后面的断言,它与文件路径前的"匹配,但不包括在匹配项中。

  • \\.+\\匹配(转义的)\,后跟任意非空字符序列(.+),后跟\。 .NET regex匹配默认为贪婪,因此通过 last \进行的所有匹配都将被匹配,从而有效地删除了文件的目录路径。