我有一个Powershell脚本,可以打开CSV文件,并仅用文件名替换第二列的完整文件路径。我可以在Powershell中使用-replace函数,但是由于文件路径的长度以及子目录的多少而异,因此我无法明确匹配某些字符串。
在使用正则表达式匹配这样的字符串时,我需要帮助:
字符串:"1003,"\\ST12345\share$\SYSTEM\V1\1\2\1234.htm"
我要匹配:\\ST12345\share$\SYSTEM\V1\1\2\
所以我可以将上面的内容替换为空(因此将其删除)。另一个问题是共享目录的数量可能有所不同,因此可能有2个反斜杠或4个反斜杠,但是总会有一个文件名,并且字符串始终以\开头。
谢谢您的帮助!
答案 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 \
进行的所有匹配都将被匹配,从而有效地删除了文件的目录路径。