Проверьте строку для всех строчных букв в PowerShell - PullRequest
5 голосов
/ 20 января 2010

Я хочу иметь возможность проверить, все ли строки PowerShell состоят из строчных букв.

Я не самая лучшая обезьяна в мире регулярных выражений, но я пытаюсь сделать следующее:

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

Но, конечно, они не работают, и поиск в Интернете никуда меня не привел. Есть ли способ сделать это (кроме тестирования каждого символа в цикле)?

Ответы [ 3 ]

10 голосов
/ 20 января 2010

PowerShell по умолчанию соответствует регистронезависимому, поэтому вам нужно использовать оператор -cmatch:

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

-cmatch равен всегда с учетом регистра, а -imatchвсегда учитывает регистр.

Примечание: Ваше регулярное выражение также было немного странным.В основном вам нужен тот, который я здесь предоставил, который состоит из

  • Якорь для начала строки (^)
  • A класс символов строчных латинских букв ([a-z])
  • A квантификатор , сообщающийПовторите класс символов по крайней мере 0 раз, тем самым сопоставляя столько символов, сколько необходимо (*).Вместо этого вы можете использовать +, чтобы запретить пустую строку.
  • Якорь для конца строки ($).Два якоря гарантируют, что регулярное выражение должно соответствовать каждому символу в строке.Если вы просто используете [a-z]*, то это будет соответствовать любой строке, в которой есть строка из не менее 0 строчных букв где-то .Это будет каждая строка.

PS: Ахмад имеет смысл, однако, что если ваша строка может состоять не только из букв, но и из других букв, и вы хотите убедиться, что каждая буква в нижнем регистре, вместо того, чтобы требовать, чтобы строка состояла только из букв, вы должны инвертировать класс символов, вроде:

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

^ в началекласс символов инвертирует класс, соответствующий каждому символу не в комплекте.Таким образом, это регулярное выражение завершится ошибкой, только если строка содержит где-то заглавные буквы.Тем не менее, -cmatch все еще необходим.

7 голосов
/ 20 января 2010

Если ваш тест очень прост, вы можете и, вероятно, должны избегать использования регулярных выражений:

$mystring -ceq $mystring.ToLower()
0 голосов
/ 20 января 2010

Попробуйте этот шаблон, который соответствует чему-либо, что не заглавная буква: "^[^A-Z]*$"

Это вернуло бы false для любых заглавных букв, позволяя строке содержать другие элементы до тех портак как все буквы строчные.Например, «hello world 123» будет допустимым.

Если вам строго нужны буквы без пробелов, цифр и т. Д., Тогда подходит решение Йоханнеса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...