1

我正在使用 Powershell 2.0。我有像my_file_name_01012013_111546.xls. 我试图得到my_file_name.xls. 我努力了:

.*(?=_.{8}_.{6})

它返回 my_file_name。但是,当我尝试

.*(?=_.{8}_.{6}).{3}

它返回my_file_name_01

我不知道如何获取扩展名(可以是任何 3 个字符。时间/日期部分将始终为 _ 8 个字符 _ 6 个字符。

我看了很多例子并尝试了很多东西,但没有运气。

4

4 回答 4

1

如果您只想查找名称和扩展名,您可能需要这样的内容:^(.*)_[0-9]{8}_[0-9]{6}(\..{3})$

my_file_name将在反向引用 1 和.xls反向引用 2 中。

如果您想删除其他所有内容并返回答案,您希望将“数字”替换为空:'my_file_name_01012013_111546.xls' -replace '_[0-9]{8}_[0-9]{6}' ''。您不能简单地将字符串的两位(名称和扩展名)作为一个匹配项拉出 - 正则表达式模式仅匹配连续的块。

于 2013-03-05T14:17:09.333 回答
0

添加时得到的原因my_filename_01是因为前瞻是零宽度。这意味着它们不使用字符串中的字符。

正如您所说,.*(?=_.{8}_.{6})匹配my_file_name是因为该字符串后面跟着一些匹配的内容_.{8}_.{6},但是一旦找到该匹配项,您就只消耗my_file_name了 ,因此添加.{3}将消耗接下来的 3 个字符,即_01.

至于适合您需求的正则表达式,其他人已经发布了可行的替代方案。

于 2013-03-05T15:00:56.823 回答
0

试试这个(未经测试),但它应该适用于任何 'my_file_name' 长度、任何数字长度和任何类型的扩展名。

"my_file_name_01012013_111546.xls" -replace '(?<=[\D_]*)(_[\d_]*)(\..*)','$2'

非正则表达式解决方案:

$a = "my_file_name_01012013_111546.xls"

$a.replace( ($a.substring( ($a.LastIndexOf('.') - 16 ) , 16 )),"") 
于 2013-03-05T14:38:25.270 回答
0

您指定的原始正则表达式返回其后有 14 个字符的最大匹配项(您可以更改为相同的 (?=.{14}))。

一旦你改变了它,它会返回它后面有 14 个字符 + 下 3 个字符的最大匹配。这就是你得到这个结果的原因。

如果您可以使用反向引用,Inductiveload 描述的方法可能会更好。我会使用以下正则表达式:(.*)[_\d]{16}\.(.*)否则,我会分两个阶段进行

  1. 获取初始部分
  2. 获取扩展名
于 2013-03-05T14:20:50.133 回答