-replace,如何只匹配第一个点?

gab*_*l__ 3 powershell

$Var = "Dog.Jumping.png", "Horse.Jumping.gif", "Cat.Jumping.jpg", "Lion.Jumping.tiff", "Shark.Jumping.svg", "Cow.Jumping.psd"
$Var -replace '\.', ' - '
Run Code Online (Sandbox Code Playgroud)

上面好像找到了两个“.” 角色,我只对第一个感兴趣。类似的事情$Var -replace '\.?', ' - '没有道理,我真的被难住了。

任何帮助将不胜感激!

San*_*zon 6

以下内容可能会满足您的需求:

$Var -replace '^(.+?)\.', '$1 - '
Run Code Online (Sandbox Code Playgroud)

另一个类似的选项是:

$Var -replace '^([^\.]+)\.', '$1 - '
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅https://regex101.com/r/1dhUz2/2

使用 的实例Regex提供了一种更简单的方法,因为其中一个.Replace重载有一个count参数

$Var | ForEach-Object { $re = [regex] '\.' } {
    $re.Replace($_, ' - ', 1)
}
Run Code Online (Sandbox Code Playgroud)

然而,正如Olaf 在他的评论中指出的那样,由于这些似乎是有效的文件名,并且假设您已使用 收集它们,因此您可以对已经排除扩展名的 ETS 属性Get-ChildItem使用文字替换。.BaseName


zet*_*t42 6

补充Santiago Squarzon 的有用答案,另一种方法是使用积极的后向断言。这样的断言向以下正则表达式模式添加了一个要求。它前面必须是断言中定义的模式。

$var -replace '(?<=^[^\.]+)\.', ' - '
Run Code Online (Sandbox Code Playgroud)

输出:

Dog - Jumping.png
Horse - Jumping.gif
Cat - Jumping.jpg
Lion - Jumping.tiff
Shark - Jumping.svg
Cow - Jumping.psd
Run Code Online (Sandbox Code Playgroud)

让我们破译子表达式(?<=^[^\.]+)

  • (?<=开始积极的回顾断言
  • ^将以下模式锚定到字符串的开头
  • [^\.]+任何不是点的字符一次或多次 ( +)
  • )结束断言

断言的优点是断言本身不会参与匹配,因此实际上只会替换点。

RegEx101 演示