我的字符串应该在我的case变量中从数字更改为文本:
$string = '18.3.0-31290741.41742-1'
我想将' - '后的所有内容替换为“-SNAPSHOT”,并在执行echo $string
时显示以下信息。我尝试使用LastIndexOf()
,Trim()
和其他内容,但似乎无法管理如何执行此操作。
预期结果:
PS> echo $string
18.3.0-SNAPSHOT
也许这可能是正确方法的亮点,但是当有两个' - '将取代最后一个而不是第一个可以看到的时候:
$string = "18.3.0-31290741.41742-1" -replace '(.*)-(.*)', '$1-SNAPSHOT'
答案 0 :(得分:2)
.*
是一个贪婪的匹配,这意味着它将产生最长的匹配(子)字符串。在你的情况下,这将是 last 连字符的所有内容。您需要非贪婪的匹配(.*?
)或不匹配连字符的模式(^[^-]*
)。
演示:
PS C:\> '18.3.0-31290741.41742-1' -replace '(^.*?)-.*', '$1-SNAPSHOT' 18.3.0-SNAPSHOT PS C:\> '18.3.0-31290741.41742-1' -replace '(^[^-]*)-.*', '$1-SNAPSHOT' 18.3.0-SNAPSHOT
通过使用正面的lookbehind断言((?<=...)
),您可以消除对捕获组和反向引用的需求:
PS C:\> "18.3.0-31290741.41742-1" -replace '(?<=^.*?-).*', 'SNAPSHOT' 18.3.0-SNAPSHOT
答案 1 :(得分:1)
您可以使用Select-String
和正则表达式来匹配模式,然后将匹配传递给ForEach-Object
(通常用别名%
缩短)以构造最终字符串:
$string = "18.3.0-31290741.41742-1" | Select-String -pattern ".*-.*-" | %{ "$($_.Matches.value)SNAPSHOT" }
$string