我需要在其中包含字母数字值的字符串中找到特殊字符。
我尝试了下面的代码段,但这不起作用。
$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"
}
即使末尾有特殊字符,输出也会显示“缺少特殊字符”。如何解决?
答案 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