替换特殊字符后的文本

时间:2018-03-13 08:44:52

标签: regex powershell

我的字符串应该在我的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'

2 个答案:

答案 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