Как я могу разрешить один пробел, A-Z, a-z, 0-9 в регулярном выражении? - PullRequest
0 голосов
/ 08 марта 2012

В основном я использую регулярное выражение, и то, что делает мой код, по сути, отправляет код возврата клиента, если он не содержит символов в регулярном выраженииМоя проблема в том, что я не знаю, как разрешить пробелы.В настоящее время это мой код, я хотел бы разрешить пробел, az, AZ и 0-9.

if (username.length() < 1 || username.length() >= 13
    || !username.matches("[a-zA-Z_0-9]"))
{
    session.getLoginPackets().sendClientPacket(3);
    return;
}

Ответы [ 5 ]

1 голос
/ 08 марта 2012

Самая большая пропущенная вещь - это повторение регулярного выражения.Например:

if (username.length() < 1 || username.length() >= 13 || !username.matches("^[a-zA-Z_0-9 ]+$")) {
    session.getLoginPackets().sendClientPacket(3);
    return;
}

Пробел должен начинаться с конца набора символов (который, я думаю, в основном соответствует тому, что вы спрашивали).Другие символы: * '^' это 'начало всей строки' * '$' это 'конец строки' (если нет перевода строки ...) * '+' это 'то, что в [...] набор символов, хотя бы один раз '

Итак, добавьте пробел в конце [] и используйте' + 'в конце, и вы должны его получить.

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

if (!username.matches("^[a-zA-Z0-9_ ]{1,13}$") {
    session.getLoginPackets().sendClientPacket(3);
    return;
}

Граница {1,13} гласит: «хотя бы один раз, максимум 13 раз» (включительно)

Я такжеЯ должен отметить, что java поддерживает некоторые сочетания клавиш, например, для любой буквы в верхнем или нижнем регистре: [A-z0-9_]

- РЕДАКТИРОВАТЬ:

После нескольких комментариев: «один пробел», я должен признать, что до сих пор не читаю требования таким образом.

Если трюк «разрешает только один пробел», это должно сработать:

if (username.length() < 1 || username.length() >= 13 || !username.matches("^[A-z0-9_]*\\s[A-z0-9_]*$")) {
    session.getLoginPackets().sendClientPacket(3);
    return;
}

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

1 голос
/ 08 марта 2012

Это зависит от того, какой класс регулярных выражений вы используете, от того, какие магические последовательности есть, но обычно либо \ s, либо: space: будут работать. Для некоторых языков, где пробел в регулярном выражении не игнорируется, вы можете просто вставить пробел непосредственно: [a-zA-Z_0-9] также будет работать.

0 голосов
/ 08 марта 2012

Попробуйте это

^[a-zA-Z_0-9]+(?: [a-zA-Z_0-9]+)?$

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

Посмотри здесь на Regexr

Поскольку [a-zA-Z_0-9] эквивалентно \w, вы можете упростить его до

^\w+(?: \w+)?$

Если вы хотите быть совместимым с Юникодом, вам следует использовать опцию Pattern.UNICODE_CHARACTER_CLASS , чтобы узнать больше :

Включает Unicode-версию предопределенных классов символов и классов символов POSIX.

означает, \w соответствует всем кодовым точкам Unicode, которые имеют свойство Буква и цифра.

0 голосов
/ 08 марта 2012

try

!username.matches("[a-zA-Z_0-9 ]")) 

ИЛИ

!username.matches("[a-zA-Z_0-9\s]"))

Причина, по которой \ s лучше, состоит в том, что он включает все символы пробела: например, табуляция

0 голосов
/ 08 марта 2012

Попробуйте это: [a-zA-Z_0-9]*( )?[a-zA-Z_0-9]*

Это позволяет использовать ровно один пробел или без пробелов в каждой комбинации символов a-z, A-Z, _, 0-9.

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