Как я могу получить регулярное выражение, чтобы проверить, что строка содержит только буквенные символы [a-z] или [A-Z]? - PullRequest
16 голосов
/ 13 июня 2009

Я пытаюсь создать регулярное выражение, чтобы убедиться, что в данной строке есть только буквенные символы a-z или A-Z. Строка может содержать до 25 букв. (Я не уверен, что регулярное выражение может проверять длину строк)

Примеры:
1. "abcdef" = true;
2. "a2bdef" = false;
3. "333" = false;
4. "j" = true;
5. "aaaaaaaaaaaaaaaaaaaaaaaaaa" = false; // 26 букв

Вот что у меня есть ... пока не могу понять, что с этим не так

Regex alphaPattern = new Regex("[^a-z]|[^A-Z]");

Я думаю, это будет означать, что строка может содержать только буквы верхнего и нижнего регистра от a-z, но когда я сопоставляю ее со строкой со всеми буквами, она возвращает false ...

Кроме того, любые предложения, касающиеся эффективности использования регулярных выражений по сравнению с другими методами проверки, будут с благодарностью.

Ответы [ 7 ]

36 голосов
/ 13 июня 2009
Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");
  • ^ означает «начать сопоставление в начале строки»
  • [a-zA-Z] означает «сопоставить строчные и прописные буквы a-z»
  • {1,25} означает «соответствует предыдущему элементу (класс символов, см. Выше) от 1 до 25 раз»
  • $ означает «только совпадение, если курсор находится в конце строки»
17 голосов
/ 14 июня 2009

Я пытаюсь создать регулярное выражение, чтобы убедиться, что в данной строке есть только альфа символы a-z или A-Z.

Легко сделать, так как многие другие указали, используя так называемые "классы персонажей". По сути, они позволяют нам указать диапазон значений, которые будут использоваться для сопоставления: (ПРИМЕЧАНИЕ: для упрощения я предполагаю, что якоря implict ^ и $ будут объяснены ниже в этом посте)

[a-z] Соответствует любой отдельной строчной букве.
например: совпадения, 8 не совпадают

[A-Z] Соответствует любой заглавной букве.
Например: совпадения, а не совпадения

[0-9] Соответствует любой цифре от нуля до девяти
например: 8 совпадений, не соответствует

[aeiou] Совпадают только на a или e или i или o или u. пример: o соответствует, z не соответствует

[a-zA-Z] Соответствует любой отдельной строчной или заглавной букве. пример: совпадения, совпадения, 3 не совпадают

Их, естественно, тоже можно отрицать: [^ a-z] Подберите все, что НЕ является строчной буквой например: 5 совпадений, A совпадений, a не совпадений

[^ A-Z] Подберите все, что НЕ является заглавной буквой пример: 5 матчей, А не соответствует, совпадения

[^ 0-9] Совпадение с любым, что НЕ является числом например: 5 не соответствует, A соответствует, соответствует

[^ Aa69] Совпадение с чем угодно, если только это не A или a или 6 или 9 пример: 5 совпадений, A не соответствует, a не соответствует, 3 соответствия

Чтобы увидеть некоторые общие классы символов, перейдите по адресу: http://www.regular -expressions.info / reference.html

Строка может содержать до 25 букв. (Я не уверен, что регулярное выражение может проверять длину строк)

Вы можете абсолютно точно проверить «длину», но не так, как вы себе представляете. Мы измеряем повторение, а НЕ длину, строго говоря, используя {}:

a {2} Совпадение двух символов a.
пример: а не соответствует, аа соответствует, ака не соответствует

4 {3} Соедините три 4 вместе. например: 4 не соответствует, 44 не соответствует, 444 соответствует, 4434 не соответствует

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

a {2,} Совпадение двух или более элементов a вместе. например: a не соответствует, aa соответствует, aaa соответствует, aba не соответствует, aaaaaaaaa соответствует

a {2,5} Совпадение от двух до пяти очков. например: a не соответствует, aa соответствует, aaa соответствует, aba не соответствует, aaaaaaaaa не соответствует

Повторение распространяется на классы персонажей, поэтому: [a-z] {5} Совпадение любых пяти символов нижнего регистра вместе. Например: Bubba соответствует, Bubba не соответствует, BUBBA не соответствует, asdjo соответствует

[A-Z] {2,5} Совпадение от двух до пяти символов в верхнем регистре вместе. Например: Bubba не соответствует, Bubba не соответствует, BUBBA соответствует, BUBBETTE не соответствует

[0-9] {4,8} Соедините четыре-восемь чисел вместе. например: bubba не соответствует, 15835 соответствует, 44 не соответствует, 3456876353456 не соответствует

[a3g] {2} Совпадение с ИЛИ 3 ИЛИ g, если они появляются дважды вместе. например: aa соответствует, ba не соответствует, 33 соответствует, 38 не соответствует, a3 НЕ соответствует

Теперь давайте посмотрим на ваше регулярное выражение: [^ а-г] | [^ A-Z] Перевод: сопоставляйте что угодно, только если это НЕ строчная буква ИЛИ заглавная буква.

Чтобы исправить это так, чтобы оно соответствовало вашим потребностям, мы переписали бы его так: Шаг 1: убрать отрицание [A-Z] | [A-Z] * * одна тысяча девяносто семь Перевод: Найдите любую строчную букву ИЛИ заглавную букву.

Шаг 2: Хотя в этом нет особой необходимости, давайте немного очистим логику ИЛИ [A-Za-Z] Перевод: Найдите любую строчную букву ИЛИ заглавную букву. То же, что и выше, но теперь используется только один набор [].

Шаг 3: Теперь давайте укажем «длину» [A-Za-Z] {1,25} Перевод: Найдите любую строчную букву ИЛИ заглавную букву, повторяемую от одного до двадцати пяти раз.

Здесь вещи становятся все более забавными. Вы можете подумать, что вы сделали здесь, и вы можете зависеть от технологии, которую вы используете.

Строго говоря, регулярное выражение [a-zA-Z] {1,25} будет соответствовать от одной до двадцати пяти заглавных или строчных букв ВСЕГДА в строке:

[A-Za-Z] {1,25} спички, AZGD, BUBBA, 243242hello242552 МАТЧИ

Фактически, каждый приведенный мной пример будет делать то же самое. Если это то, что вы хотите, то вы в хорошей форме, но, основываясь на своем вопросе, я предполагаю, что вы хотите ТОЛЬКО от одной до двадцати пяти заглавных или строчных букв на всей строке. Для этого обратимся к якорям. Якоря позволяют нам указывать такие неприятные детали:

^ начало строки
(Я знаю, мы просто использовали это для отрицания раньше, не начинайте меня)

$ конец строки

Мы можем использовать их так:

^ a {3} С начала строки сопоставьте три раза вместе например: совпадения aaa, совпадения 123aaa, совпадения aaa123

a {3} $ Совпадение три раза вместе в конце строки например: совпадения aaa, совпадения 123aaa, совпадение aaa123

^ a {3} $ Совместите три раза вместе для строки ENTIRE например: aaa соответствует, 123aaa не соответствует, aaa123 не соответствует

Обратите внимание, что aaa совпадает во всех случаях, потому что у него есть три буквы a в начале и в конце строки с технической точки зрения.

Таким образом, окончательное, технически правильное решение для поиска «слова» в строке длиной до пяти символов будет иметь вид:

^ [A-Za-Z] {1,25} $

Самое интересное в том, что некоторые технологии неявно ставят якоря в регулярное выражение для вас, а некоторые - нет. Вам просто нужно проверить свое регулярное выражение или прочитать документы, чтобы увидеть, есть ли у вас неявные якоря.

6 голосов
/ 13 июня 2009

Строка может содержать до 25 букв. (Я не уверен, что регулярное выражение может проверять длину строк)

Регулярные выражения могут проверять длину строки - как видно из ответов, отправленных другими.

Однако, когда вы проверяете ввод пользователя (скажем, имя пользователя), я бы посоветовал сделать эту проверку отдельно.

Проблема в том, что регулярное выражение может только сказать вам, соответствует строка или нет. Это не скажет, почему это не соответствовало. Был ли текст слишком длинным или он содержал недопустимые символы - вы не можете сказать. Это не очень удобно, когда программа говорит: «Указанное имя пользователя содержит недопустимые символы или слишком длинное». Вместо этого вы должны предоставить отдельные сообщения об ошибках для разных ситуаций.

5 голосов
/ 15 июня 2009
/// <summary>
/// Checks if string contains only letters a-z and A-Z and should not be more than 25 characters in length
/// </summary>
/// <param name="value">String to be matched</param>
/// <returns>True if matches, false otherwise</returns>
public static bool IsValidString(string value)
{
    string pattern = @"^[a-zA-Z]{1,25}$";
    return Regex.IsMatch(value, pattern);
}
4 голосов
/ 13 июня 2009

Используемое вами регулярное выражение - это чередование [^a-z] и [^A-Z]. А выражения [^…] означают совпадение с любым другим символом, кроме тех, которые описаны в наборе символов.

Таким образом, в целом ваше выражение означает совпадение с любым отдельным символом, кроме a-z или A-Z.

Но вам скорее нужно регулярное выражение, которое соответствует только a-zA-Z:

[a-zA-Z]

И чтобы указать длину этого, прикрепите выражение к началу (^) и концу ($) строки и опишите длину с помощью {n ,m} квантификатор, означающий не менее n, но не более m повторений:

^[a-zA-Z]{0,25}$
1 голос
/ 13 июня 2009

Существуют отличные интерактивные инструменты для разработки и тестирования выражений регулярных выражений:

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

1 голос
/ 13 июня 2009

Правильно ли я понимаю, что он может содержать только или прописные буквы или строчные буквы?

new Regex("^([a-z]{1,25}|[A-Z]{1,25})$")

Регулярное выражение кажется правильным для этого случая.

Кстати, каретка ("^") на первом месте внутри класса символов означает "не", поэтому ваш "[^a-z]|[^A-Z]" будет означать "не любая строчная буква или не какая-либо прописная буква" (не учитывая что я не все буквы).

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