Powershell - 用通配符替换子字符串

时间:2018-04-10 20:29:58

标签: powershell

我在PowerShell中编写了一个函数,其中一部分需要用通配符替换子串的出现。字符串看起来像这样:

"something-#{reference}-somethingElse-#{anotherReference}-01"

我希望它最终看起来像这样:

"something-*-somethingElse-*-01"

我在这里遇到的问题是我不知道"#{something}"将会是,在一个hashtag中包含多个子字符串,然后是大括号。我已经尝试过像这样的替换方法:

$newString = $originalString.Replace('#{*}', '*')

我希望这会取代从主题标签到结束花括号的所有内容,但它并不像那样工作。我试图避免使用基于查找'#'的索引的繁琐代码。和'}'然后更换,并希望有一个更简单,更优雅的解决方案。

1 个答案:

答案 0 :(得分:2)

你的替换至少有一个问题,可能是两个;

  1. 方法$string.Replace()来自.Net框架字符串类 - 它是PowerShell,但它正是您在C#中获得的,最小的PowerShell脚本 - 便利性添加在顶部 - 它是文字的文本替换 - 它不支持通配符或正则表达式。

  2. 据我所知,PowerShell中的'通配符'支持非常有限,仅限-like运算符。这不能替代文本,对于不懂正则表达的人来说是方便的;无论如何,它在幕后转换为正则表达式。因此,a*b替换的梦想也无效。

  3. 作为@PetSerAl注释,正则表达式和PowerShell -replace运算符是PowerShell方法,可以在没有.indexOf()的情况下快速替换每个字符串模式。

    他们的模式#{[^}]*}扩展为:

      外面的
    • #{},作为文字字符
      • [^}]作为一个字符类,说“不是}字符,而是其他任何字符”
      • [*}]* - 与not }'s一样多。{/ li>

    所以,匹配哈希和开括号,不是结束括号括号的所有东西(以避免超过结束括号),然后是右括号。将其全部替换为文字*

    隐式地,在输入字符串中尽可能多地搜索/替换。