在PowerShell中查找和替换特殊字符

7

我有一个方法,其中包含一个if语句,用于捕获特殊字符。现在我想做的是找到特殊字符的位置并将其替换为_A。

一些例子

  • test# 变成 test_A

  • I#hope#someone#knows#the#answer# 变成 I_Ahope_Asomeone_Aknows_Athe_Aanswer_A

或者如果它有多个特殊字符

  • You?didnt#understand{my?Question# 变成 You_Adidnt_Aunderstand_Amy_AQuestion_A

我是否必须遍历整个字符串,并在到达该字符时将其更改为_A,还是有更快的方法可以做到这一点?

1个回答

24

# 就像任何其他字符一样,您可以使用 -replace 运算符:

PS C:\>'I#hope#someone#knows#the#answer#' -replace '#','_A'
I_Ahope_Asomeone_Aknows_Athe_Aanswer_A

正则表达式很神奇,您可以定义所有您想要的特殊情况(大括号必须被转义):

正则表达式是魔法,您可以定义所有您喜欢的特殊情况(大括号需要被转义):

PS C:\>'You?didnt#understand{my?Question#' -replace '[#?\{]','_A'
You_Adidnt_Aunderstand_Amy_AQuestion_A

所以你的函数可能看起来像这样:

function Replace-SpecialChars {
    param($InputString)

    $SpecialChars = '[#?\{\[\(\)\]\}]'
    $Replacement  = '_A'

    $InputString -replace $SpecialChars,$Replacement
}

Replace-SpecialChars -InputString 'You?didnt#write{a]very[good?Question#'

如果您不确定要进行转义的字符,请让regex类为您完成!

function Replace-SpecialChars {
    param(
        [string]$InputString,
        [string]$Replacement  = "_A",
        [string]$SpecialChars = "#?()[]{}"
    )

    $rePattern = ($SpecialChars.ToCharArray() |ForEach-Object { [regex]::Escape($_) }) -join "|"

    $InputString -replace $rePattern,$Replacement
}

您也可以使用.NET字符串方法Replace()

'You?didnt#understand{my?Question#'.Replace('#','_A').Replace('?','_A').Replace('{','_A')

但我觉得使用正则表达式的方式更加简洁。


这不会找到特殊字符的位置,因为字符串中可能有多个特殊字符。 - davetherave
@davetherave,如果替换按预期进行,为什么您对位置感兴趣?我已经更新了答案,以展示如何将其扩展到不仅限于# - Mathias R. Jessen
这个回答解决了你提出的问题。如果你真的想要另一个问题的答案,那么你需要回去编辑你的原始帖子。 - Walter Mitty
谢谢,抱歉我是PowerShell的新手,所以需要解释一下。 - davetherave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接