检查字符串中的特殊字符

时间:2019-07-05 05:25:15

标签: powershell

我需要在其中包含字母数字值的字符串中找到特殊字符。

我尝试了下面的代码段,但这不起作用。

$Special_characters = ('\n|\r|\t|\a|\"|\`')
$Value = "g63evsy3swisnwhd83bs3hs9sn329hs\t"
if($Value -match $Special_characters)
{
    Write-Host "Special characters are present"
}
else
{
    Write-Host "special characters are absent"
}

即使末尾有特殊字符,输出也会显示“缺少特殊字符”。如何解决?

4 个答案:

答案 0 :(得分:1)

$Special_Characters是一个字符串,因此您的代码正在搜索要在$Value中找到的整个单词(\ n | \ r | \ t | \ a | \“ |`),找不到。

必须使用数组代替字符串,如下所示:

$Value = "g63evsy3swisnwhd83bs3hs9sn329hs\t"
$Special_Characters = @('\\n','\\r','\\t','\\a','\\"','\\`')
$Special_Characters | Foreach-Object {
    if ($Value -match $_) {
        "$_ is present"
    } else {
        "$_ is not present"
    }
}

注意

您必须放置双反斜杠(\\),因为在Powershell中反斜杠被视为转义符;在here中查找有关Powershell中反斜杠的更多信息

答案 1 :(得分:1)

这里有一个误会。
反斜杠用于在Regular Expression中定义特殊字符,例如\t定义标签。
但是,PowerShell并非如此。要在PowerShell中定义特殊字符,您需要使用反引号字符(请参见:About Special Characters),例如制表符写为`t

换句话说,问题中的正则表达式模式正确,但输入字符串不正确(与问题/标题所暗示的相反,实际上没有特殊字符在给定的输入字符串中“)。
应该是:

"...hs9sn329hs`t" -match '\n|\r|\t|\a|\"|\`'
True

由于涉及单个(特殊)字符的列表,因此您可能还会考虑使用方括号表达式(而不是 OR “竖线”字符):

"...hs9sn329hs`t" -match '[\n\r\t\a\"\`]'
True

反之亦然:允许使用double quotes在正则表达式模式中使用特殊字符,以便PowerShell可以评估字符串(但我建议反对):

"...hs9sn329hs`t" -match "`n|`r|`t|`a|`"|``"
True

如果问题中的输入字符串确实是您要检查的字符串(暗示您将反斜杠称为特殊字符,而实际上不是),则需要检查\t而不是而不是标签。为此,您需要在正则表达式中转义反斜杠以与\t完全匹配:

"...hs9sn329hs\t" -match '\\n|\\r|\\t|\\a|\\"|\\`'
True

答案 2 :(得分:0)

单线:

$Special_characters = '\n|\r|\t|\a|\"|\`'
$Value = "g63evsy3swisnwhd83bs3hs9sn329hs\t"

$result = @($Special_characters -split '\|' | % { $Value.Contains( $_ ) }).Contains( $true )

找到一个特殊字符后,$ result为true,否则为false。

答案 3 :(得分:0)

这是您引用的所有特殊字符。您可以单独尝试一个字符串,以查看它是否有效。它必须用双引号引起来。

PS /Users/js> "`n`r`t`a`"``"

    "`

您还可以单独试用-match运算符。

PS /Users/js> "`n`r`t`a`"``" -match '\n|\r|\t|\a|\"|\`'
True

关于特殊字符:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_special_characters?view=powershell-6