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

Я наткнулся на интересный фрагмент в Руководстве по стилю Google C ++

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

Может быть трудно определить, требуется ли предварительное объявление или полное #include. Замена #include на предварительное объявление может молча изменить значение кода:

// b.h:
struct B {};
struct D : B {};

// good_user.cc:
#include "b.h"
void f(B*);
void f(void*);
void test(D* x) { f(x); }  // calls f(B*)

Если заменить #include на прямое decls для B и D, test () вызовет f (void *).

17
задан rpurant 22 February 2016 в 12:40
поделиться

7 ответов

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

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

  • первая строка соответствует хосту, начинающемуся строго с sample.com, поэтому www.sample.com не соответствует.

  • во второй строке требуется хотя бы один символ, за которым следует www.sample.com, который также не содержит ' (Я не уверен, что регулярное выражение может проверять длину строк)

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

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

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

6
ответ дан 30 November 2019 в 10:05
поделиться
/// <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);
}
7
ответ дан 30 November 2019 в 10:05
поделиться

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

Таким образом, в целом ваше выражение означает соответствие любому одному символу, кроме az или иное, кроме AZ .

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

[a-zA-Z]

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

1
ответ дан 30 November 2019 в 10:05
поделиться

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

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

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

[AZ] Соответствует любой отдельной заглавной букве.
пример: A соответствует, a не соответствует

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Повторение распространяется на классы символов, поэтому: [az] {5} Сопоставьте любые пять символов нижнего регистра вместе. пример: bubba соответствует, Bubba не соответствует, BUBBA не соответствует, asdjo соответствует

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

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

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

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

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

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

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

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

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

[a-zA-Z] {1,25} a соответствует, aZgD соответствует, BUBBA соответствует, 243242hello242552 MATCHES

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

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

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

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

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

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

^ a {3} $ Трижды сопоставить a для строки ENTIRE пример: aaa совпадает, 123aaa не совпадает, aaa123 не совпадает

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

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

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

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

18
ответ дан 30 November 2019 в 10:05
поделиться

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

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

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

Между прочим, вставка («^») на первом месте внутри класса символов означает «не», поэтому ваш « [^ az] | [^ AZ] "будет означать" ни строчные, ни заглавные буквы "(без учета того, что az не все буквы).

1
ответ дан 30 November 2019 в 10:05
поделиться

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

Итак, в целом ваше выражение означает соответствие любому одному символу, кроме az или иное, кроме AZ .

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

[a-zA-Z]

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

^[a-zA-Z]{0,25}$
4
ответ дан 30 November 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: