6

我希望能够测试 PowerShell 字符串是否都是小写字母。

我不是世界上最好的正则表达式猴子,但我一直在尝试这些方面:

if ($mystring -match "[a-z]^[A-Z]") {
    echo "its lower!"
}

但是当然它们不起作用,并且搜索互联网并没有让我到任何地方。有没有办法做到这一点(除了测试循环中的每个字符)?

4

3 回答 3

12

默认情况下,PowerShell 不区分大小写匹配,因此您需要使用-cmatch运算符:

if ($mystring -cmatch "^[a-z]*$") { ... }

-cmatch始终区分大小写,而始终-imatch不区分大小写。

旁注:你的正则表达式也有点奇怪。基本上你想要我在这里提供的一个,它包括

  • 字符串开头的锚点( ^)
  • 小写拉丁字母 ( )的字符类[a-z]
  • 一个量词,告诉重复字符类至少 0 次,从而匹配尽可能多的字符(*)。您可以+改为使用来禁止空字符串。
  • 字符串结尾的锚点( $)。这两个锚确保正则表达式必须匹配字符串中的每个字符。如果您只是使用,那么这将匹配任何在其中某处[a-z]*至少包含0小写字母的字符串的字符串。这将是每个字符串。

PS:不过,Ahmad 有一点,如果您的字符串也可能包含字母以外的其他内容,并且您想确保其中的每个字母都是小写的,而不是还要求字符串仅由字母组成,那么你必须反转字符类,有点:

if ($mystring -cmatch "^[^A-Z]*$") { ... }

^字符类开头的反转,匹配包含的每个字符。因此,只有当字符串在某处包含大写字母时,此正则表达式才会失败。尽管如此,-cmatch仍然需要。

于 2010-01-20T01:36:01.250 回答
8

如果您的测试如此简单,您可以并且可能应该避免使用正则表达式:

$mystring -ceq $mystring.ToLower()
于 2010-01-20T09:03:49.770 回答
0

试试这个模式,它匹配任何不是大写字母的东西:"^[^A-Z]*$"

这将对任何大写字母返回 false,同时允许字符串包含其他项目,只要所有字母都是小写。例如,“hello world 123”将是有效的。

如果您严格要求没有空格、数字等的字母,那么 Johannes 的解决方案适合。

于 2010-01-20T01:38:01.577 回答