查找并替换特殊字符powershell

时间:2015-06-11 10:20:45

标签: powershell

我有一个方法,如果找到一个特殊字符,就会捕获一个if语句。如果找到特殊字符的位置并将其替换为_A

,我现在想做什么

一些例子

  • 测试#变为 test_A

  • 我#希望#某人#知道##答案#变为 I_Ahope_Asomeone_Aknows_Athe_Aanswer_A

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

  • 你?没有#了解{我?问题#变得 You_Adidnt_Aunderstand_Amy_AQuestion_A

我是否必须循环遍历整个字符串,当我到达该字符时将其更改为_A或者是否有更快的方法来执行此操作?

1 个答案:

答案 0 :(得分:10)

#只是一个与其他人一样的角色,您可以使用-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')

但我觉得正则表达式更简洁