PowerShell-替换字符串中某个字符的所有出现位置(除一个之外)

PowerShell-替换字符串中某个字符的所有出现位置(除一个之外)

在 SAPIEN PS studio 2018 中编写 PS 表格。

问题:文本框中有一个随机字符串,其中包含方括号(“[”或“]”)

预期:需要允许用户仅输入一个括号序列

例如:

1> bla[]bla //valid
2> []bla //valid
3> bla[[] // not valid
4> b[la[] // not valid
5> b]la[] // not valid
etc..

我的代码到目前为止(使用了这里):

if ($this.Text -match '(\[){2,}') { $this.Text = $this.Text -replace '(.*?)\[(.*)', '$1$2' }
if ($this.Text -match '(\]){2,}') { $this.Text = $this.Text -replace '(.*?)\](.*)', '$1$2' }

此代码仅当括号匹配在一起时才有效(示例 3),但对于示例 4 和 5 则不起作用,请问有什么建议吗?

答案,作者:Lieven Keersmaekers

@('bla[]bla','[]bla','bla[[]','b[la[]','b]la[]') | % { $_ -replace '\[.*\]', '[]' -replace '\](?=.*\[)'}

答案1

针对您给出的示例和约束进行以下工作

-replace '\[.*\]', '[]' -replace '\](?=.*\[)'

要点是

  • '\[.*\]', '[]'删除第一个左括号和最后一个右括号之间的所有内容
  • '\](?=.*\[)'删除剩余的右括号,并对左括号进行正向预测

例子

@('bla[]bla','[]bla','bla[[]','b[la[]','b]la[]') | % { 
    $_ -replace '\[.*\]', '[]' -replace '\](?=.*\[)'}

返回

bla[]bla
[]bla
bla[]
b[]
bla[]

相关内容