2010-01-20 57 views
5

我想能够测试一个powershell字符串是否全部是小写字母。检查字符串在PowerShell中的所有小写字母

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

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

但是,当然,他们不工作,和搜索interwebs还没有得到我的任何地方。有没有人知道如何做到这一点(除了测试循环中的每个字符)?

回答

9

PowerShell的默认匹配不区分大小写的,所以你需要使用-cmatch操作:

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

-cmatch总是区分大小写的,而-imatch总是不区分大小写。

注意:你的正则表达式也有点奇怪。基本上,你要我在这里提供的之一,下设

  • anchor为字符串的开头(^
  • 小写拉丁字母([a-z]
  • 一个quantifier,告诉至A character class至少重复字符类0次,从而根据需要匹配尽可能多的字符(*)。您可以使用+代替禁用空字符串。
  • anchor为字符串末尾($)。两个锚点确保每个字符在字符串中的正则表达式必须匹配。如果你只是使用[a-z]*,那么这将匹配任何字符串,它至少有0小写字母的某个地方在其中。这将是每一个字符串。

PS:艾哈迈德说的有道理,不过,如果你的字符串可能包括其他的事情不是字母也和你想要的,而不是还要求,以确保每一个它是小写,字符串仅由字母,那么你必须反转字符类,排序:

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

^在字符类反转类的开始,每一个人物匹配不包括在内。因此这个正则表达式只会在字符串包含大写字母的地方失败。仍然需要-cmatch

+0

说的伟大工程,为感谢额外的解释。 – falkaholic

0

尝试这种模式,它匹配任何是大写字母:"^[^A-Z]*$"

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

如果您严格要字母不含空格,数字等,那么Johannes的解决方案就适合了。

+2

默认情况下,PowerShell不区分大小写,因此这不起作用。不是没有其他运营商。 – Joey

5

如果您的测试就是这么简单,你可以,而且也应该避免使用正则表达式:

$mystring -ceq $mystring.ToLower() 
+1

哇,那更简单。下次我使用它。 – falkaholic

+0

如果您需要,请确保使用方法的重载签名接受'CultureInfo'对象。 – guillermooo

+0

我测试了接受的答案和这个在20,643行的txt文件上,这个答案在每次运行中花费的时间大约是接受的答案的1/2。 –

相关问题