2010-01-20 22 views
5

Tôi muốn có thể kiểm tra xem chuỗi PowerShell có phải là tất cả các chữ thường hay không.kiểm tra chuỗi cho tất cả các chữ thường trong powershell

tôi không phải là thế giới tốt nhất khỉ regex, nhưng tôi đã cố gắng cùng những dòng này:

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

Nhưng tất nhiên họ không làm việc, và tìm kiếm interwebs chưa đã cho tôi bất cứ nơi nào. Có ai biết cách để làm điều này (ngoài việc kiểm tra tất cả các nhân vật trong một vòng lặp)?

Trả lời

9

PowerShell theo mặc định phù hợp với trường hợp-insensitively, vì vậy bạn cần phải sử dụng -cmatch điều hành:

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

-cmatchluôn trường hợp nhạy cảm, trong khi -imatch luôn là case-insensitive.

Lưu ý phụ: Cụm từ thông dụng của bạn cũng hơi lạ. Về cơ bản bạn muốn người tôi cung cấp ở đây bao gồm

  • Các anchor cho sự bắt đầu của chuỗi (^)
  • Một character class của chữ thường Latinh ([a-z])
  • Một quantifier, nói đến lặp lại lớp nhân vật ít nhất 0 lần, do đó khớp với nhiều ký tự nếu cần (*). Thay vào đó, bạn có thể sử dụng + để không cho phép một chuỗi trống.
  • anchor cho phần cuối của chuỗi ($). Hai neo đảm bảo rằng cụm từ thông dụng phải khớp với mỗi ký tự trong chuỗi. Nếu bạn chỉ sử dụng [a-z]* thì điều này sẽ khớp với bất kỳ chuỗi nào có một chuỗi có ít nhất 0 chữ thường ở đâu đó trong đó. Mà sẽ là mỗi chuỗi.

PS: Ahmad có một điểm, mặc dù, rằng nếu chuỗi của bạn có thể bao gồm những thứ khác hơn chữ quá và bạn muốn chắc chắn rằng tất cả các thư trong đó là chữ thường, thay vì cũng đòi hỏi rằng chuỗi chỉ bao gồm các chữ cái, sau đó bạn phải đảo ngược lớp nhân vật, loại:

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

các ^ vào lúc bắt đầu của đảo ngược lớp nhân vật lớp, phù hợp với tất cả các nhân vật không bao gồm. Qua đó biểu thức chính quy này sẽ chỉ thất bại nếu chuỗi chứa chữ hoa ở đâu đó. Tuy nhiên, vẫn cần -cmatch.

+0

rằng hoạt động tuyệt vời, cảm ơn cho lời giải thích thêm. – falkaholic

0

Hãy thử mô hình này, mà phù hợp với bất cứ điều gì đó là không một ký tự hoa: "^[^A-Z]*$"

này sẽ trả về false cho bất kỳ chữ hoa trong khi cho phép các chuỗi để chứa các vật dụng khác miễn là tất cả các chữ là chữ thường. Ví dụ: "hello world 123" sẽ hợp lệ.

Nếu bạn thực sự muốn các chữ cái không có dấu cách, số, v.v. thì giải pháp của Johannes phù hợp.

+2

PowerShell khớp với phân biệt chữ hoa chữ thường theo mặc định, do đó, tính năng này không thể hoạt động. Không phải không có nhà điều hành khác. – Joey

5

Nếu thử nghiệm của bạn là đơn giản như vậy, bạn có thể và có lẽ nên tránh việc sử dụng các biểu thức thông thường:

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

wow, điều đó đơn giản hơn. Lần sau tôi đang sử dụng nó. – falkaholic

+0

Đảm bảo sử dụng chữ ký quá tải của phương thức chấp nhận đối tượng 'CultureInfo' nếu bạn cần. – guillermooo

+0

Tôi đã thử nghiệm cả câu trả lời được chấp nhận và câu trả lời này trên một tệp txt với 20.643 hàng và câu trả lời này mất khoảng 1/2 thời gian để xử lý trong mọi lần chạy so với câu trả lời được chấp nhận. –

Các vấn đề liên quan