Чтобы проверить наличие специальных символов в строке - PullRequest
1 голос
/ 05 июля 2019

Мне нужно найти специальный символ в строке, в которой есть буквенно-цифровые значения.

Я попробовал приведенный ниже фрагмент кода, но он не работает.

$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 ]

1 голос
/ 05 июля 2019

Здесь есть недоразумение.
Обратная косая черта используется для определения специального символа в Регулярном выражении , например, \t определяет вкладку.
Но это не такдля PowerShell.Чтобы определить специальный символ в PowerShell, вам нужно использовать символ обратного удара (см .: О специальных символах ), например, вкладка записывается как `t.

Другими словами, шаблон регулярного выражения в вопросе является правильным, но входная строка не является ( в отличие от того, что предлагает вопрос / заголовок, на самом деле специального символа * нет1013 * в данной входной строке").
оно должно быть:

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

Что касается списка одиночных (специальных) символов, вы также можете рассмотреть выражение в скобках (скореечем OR символ "pipe") для этого:

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

Наоборот: допускается использование специальных символов в шаблоне регулярного выражения с использованием двойных кавычек , чтобы PowerShell оценил строку (но я рекомендую против этого):

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

Если входная строка в вопросе действительно является строкой, которую вы хотите проверить (подразумевая, что вы ссылаетесь на обратную косую чертув качестве специального символа (формально это не так), вы хотите проверить наличие \t вместо tab,. Для этого вам нужно будет экранировать обратную косую черту в вашем регулярном выражении до lитерально соответствует \t:

"...hs9sn329hs\t" -match '\\n|\\r|\\t|\\a|\\"|\\`'
True
1 голос
/ 05 июля 2019

$Special_Characters здесь строка, поэтому ваш код ищет все слово (\ n | \ r | \ t | \ a | \ "|`), которое можно найти в $Value, которое не найдено .

Вместо строки вы должны использовать массив следующим образом:

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

Примечание

Вы должны поставить двойную обратную косую черту (\\), потому что в Powershell обратная косая черта считается escape-символом; Смотрите здесь для получения дополнительной информации о обратной косой черте в Powershell

0 голосов
/ 05 июля 2019

Вот все специальные символы, на которые вы ссылались. Вы можете попробовать строку самостоятельно, чтобы посмотреть, работает ли она. Это должно быть в двойных кавычках.

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

0 голосов
/ 05 июля 2019

Это однострочник:

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

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

$ result равно true, когда найден специальный символ, в противном случае - false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...