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

Я пытаюсь создать регулярное выражение, чтобы убедиться, что данная строка содержит только альфа-символы 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...

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

[^ A-Z] Сопоставьте все, что не является буквой верхнего регистра ex: 5 совпадений, A не соответствует, соответствует

[^ 0-9] Сопоставьте все, что НЕ является числом ex: 5 не соответствует, A соответствует, соответствует

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

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

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

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

a {2} Совместите два а вместе.
ex: a не соответствует, aa соответствует, aca не соответствует

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

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

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

a {2,5} Сопоставьте по две-пять а вместе. ex: a не соответствует, aa соответствует, aaa соответствует, aba не соответствует, aaaaaaaaa не соответствует

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

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

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

[a3g] {2} Сопоставьте a OR 3 OR g, если они отображаются дважды вместе. ex: aa match, 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} будет соответствовать от одной до двадцати пяти или более строчных букв ANYWHERE по строке:

[A-Za-Z] {1,25} совпадения, совпадения aZgD, совпадения BUBBA, 243242hello242552 MATCHES

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

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

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

Мы можем использовать их следующим образом:

^ a {3} С самого начала линии матч три раза вместе ex: aaa matches, 123aaa не соответствует, aaa123 соответствует

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

/// <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);
}

Ответ 5

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

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

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

[a-zA-Z]

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

^[a-zA-Z]{0,25}$

Ответ 6

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

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

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

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

Ответ 7

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

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