验证用户输入是否符合混合大小写要求

Validating user entry matches mixed case requirements

我正在尝试弄清楚如何测试混合大小写或将用户输入更改为混合大小写。

目前我的代码包括:

$Type = Read-Host 'Enter MY, OLD, NEWTest, Old_Tests'

但是,我需要验证用户输入的大小写是否准确,以及他们是否没有将大小写更改为正确的大小写。我已经在此处和其他网站上查看了很多不同的问题,但 none 似乎真的在谈论以我能理解的方式验证混合大小写。

  1. Validate User Entry
  2. Regex to match mixed case words
  3. Validating String User Entry
  4. How to check if a string is all upper case (lower case) characters?
  5. Learn Powershell | Achieve More
  6. How To Validate Parameters in PowerShell
  7. $args in powershell

我不会要求任何人为我编写代码。我要求提供一些示例代码,以便我了解如何验证和更改条目。

PowerShell 默认执行 case-insensitive 比较,因此要回答问题的第一部分,您需要进行 case-sensitive 比较,即 -ceq.

$Type = Read-Host 'Enter MY, OLD, NEWTest, Old_Tests'
($Type -ceq 'MY' -or  $Type -ceq 'OLD' -or  $Type -ceq 'NEWTest' -or  $Type -ceq 'Old_Tests')

虽然一个更简单的解决方案是使用 case-sensitive contains -ccontains:

('MY', 'OLD', 'NEWTest', 'Old_Tests' -ccontains $Type)

以下是您可以更正案例的一种方法:

$Type = Read-Host 'Enter MY, OLD, NEWTest, Old_Tests'

If ('MY', 'OLD', 'NEWTest', 'Old_Tests'  -cnotcontains $Type){

    If ('MY', 'OLD', 'NEWTest', 'Old_Tests' -contains $Type){
        $TextInfo = (Get-Culture).TextInfo

        $Type = Switch ($Type) {
            {$_ -in 'MY','OLD'} { $Type.ToUpper() }
            'NEWTest'           { $Type.Substring(0,4).ToUpper() + $Type.Substring(4,3).ToLower() }
            'Old_Tests'         { $TextInfo.ToTitleCase($Type) }
        }  
    } Else {
        Write-Warning 'You didnt enter one of: MY, OLD, NEWTest, Old_Tests'
    }
}

Write-Output $Type

解释:

首先,我们测试四个允许的单词的大小写是否正确(-cnotcontains 区分大小写,不包含),如果是,我们什么也不做。如果大小写不正确,那么我们测试文本是否正确(不关心区分大小写-contains)。

如果文本是正确的,那么我们使用 Switch 语句来处理我们想要调整大小写的不同场景:

第一个开关测试匹配前两个单词,并使用 ToUpper() 字符串方法将它们简单地大写。

第二个开关测试使用字符串方法SubString获取字符串的一个子集,从第一个字符(0)开始,长度为4个字符。我们用 ToUpper 将其大写,然后我们添加字符串的下 3 个字符,从第 4 个字符开始,我们用 ToLower().

将其强制为小写

我们使用取自 get-culture cmdlet 的 .NET 方法处理的最终切换测试允许我们将标题大小写为字符串(将每个单词的首字母大写)。

如果输入的文本与我们使用的选项之一不匹配 write-warning(可能需要 PowerShell 4 或更高版本,如果没有,请将其更改为 write-host)进行打印控制台警告。

最后,无论输入什么,我们都会使用 Write-Output.

发送到标准输出