我在PowerShell中编写了一个函数,其中一部分需要用通配符替换子串的出现。字符串看起来像这样:
"something-#{reference}-somethingElse-#{anotherReference}-01"
我希望它最终看起来像这样:
"something-*-somethingElse-*-01"
我在这里遇到的问题是我不知道"#{something}"将会是,在一个hashtag中包含多个子字符串,然后是大括号。我已经尝试过像这样的替换方法:
$newString = $originalString.Replace('#{*}', '*')
我希望这会取代从主题标签到结束花括号的所有内容,但它并不像那样工作。我试图避免使用基于查找'#'的索引的繁琐代码。和'}'然后更换,并希望有一个更简单,更优雅的解决方案。
答案 0 :(得分:2)
你的替换至少有一个问题,可能是两个;
方法$string.Replace()
来自.Net框架字符串类 - 它是PowerShell,但它正是您在C#中获得的,最小的PowerShell脚本 - 便利性添加在顶部 - 它是文字的文本替换 - 它不支持通配符或正则表达式。
据我所知,PowerShell中的'通配符'支持非常有限,仅限-like
运算符。这不能替代文本,对于不懂正则表达的人来说是方便的;无论如何,它在幕后转换为正则表达式。因此,a*b
替换的梦想也无效。
作为@PetSerAl注释,正则表达式和PowerShell -replace
运算符是PowerShell方法,可以在没有.indexOf()
的情况下快速替换每个字符串模式。
他们的模式#{[^}]*}
扩展为:
#{}
,作为文字字符
[^}]
作为一个字符类,说“不是}
字符,而是其他任何字符”[*}]*
- 与not }'s
一样多。{/ li>
所以,匹配哈希和开括号,不是结束括号括号的所有东西(以避免超过结束括号),然后是右括号。将其全部替换为文字*
。
隐式地,在输入字符串中尽可能多地搜索/替换。