2010-01-20 120 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。 –

相關問題