Только латинские буквы java

Java,задача на логин

Вся работа выполняется в файле доамашнего задания
* Если вас просят создать класс — его надо создать вложенным, т.е. внутри класса HomeWorkN
* вы создаете класс MyClass <> (все в одном файле)
Задание:
* 1. Создайте вложенный класс LoginValidationException, унаследуйте его от Exception
* 2. Реализуйте проверку «Логина» в методе validateLogin по следуюзим правилам:
* — должен содержать только латинские буквы, цифры и знак подчеркивания
* — должен содержать как минимум одну маленькую, одну большую букву, цифру и нижнее подчеркивание
* — максимальная длинна логина- 20 символов
* — если логин не соответствует требованиям — выбросить LoginValidationException
* — можно использовать регулярные выражения
* 3. Реализуйте проверку логина в методе isLoginValid по следующим правилам
* — метод должен вызывать метод validateLogin
* — если метод validateLogin не выбросил ошибку — вернуть true
* — если метод validateLogin выбросил ошибку — вернуть false
*/

public class HomeWorkN < 
// вложенный класс LoginValidationException
public static class LoginValidationException extends Exception <
public LoginValidationException(String message) <
super(message);
>
>

// метод для валидации логина
public static void validateLogin(String login) throws LoginValidationException <
// регулярное выражение для проверки логина
String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[_])[A-Za-z\\d_]$";

if (!login.matches(regex)) <
throw new LoginValidationException("Некорректный логин");
>
>

// метод для проверки логина
public static boolean isLoginValid(String login) <
try <
validateLogin(login);
return true;
> catch (LoginValidationException e) <
return false;
>
>

// пример использования
public static void main(String[] args) <
String login1 = "user_123";
String login2 = "USER_123";
String login3 = "user123";

System.out.println(isLoginValid(login1)); // true
System.out.println(isLoginValid(login2)); // true
System.out.println(isLoginValid(login3)); // false
>
>

Источник

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

Я разрабатываю приложение GWT, где пользователь может вводить свои данные на японском языке. Но «идентификатор пользователя» и «пароль» должны содержать только английские символы (латинский алфавит). Как проверить строки для этого?

Есть английские символы. Я думал, что символы английского языка взяты из латинского алфавита. — Matt S.

ну, если он имеет в виду символы ascii, я бы назвал их английскими символами .. или американскими. — Tor Valamo

6 ответы

Вы можете использовать String#matches() с немного регулярное выражение для этого. Латинские символы покрываются \w .

boolean valid = input.matches("\\w+"); 

Это, кстати, также касается чисел и символа подчеркивания _ . Не уверен, что это вредит. В противном случае вы можете просто использовать [A-Za-z]+ .

Читайте также:  Разместить файл index html

Если вы хотите прикрыть диакритические символы также (ä, é, ò и т. д., это по определению также латинские символы), тогда вам нужно сначала нормализовать их и избавиться от диакритических знаков перед сопоставлением просто потому, что нет (задокументировано) регулярное выражение, которое охватывает диакритические знаки.

String clean = Normalizer.normalize(input, Form.NFD).replaceAll("\\p+", ""); boolean valid = clean.matches("\\w+"); 

Обновление ПО: в Java есть недокументированное регулярное выражение, которое также охватывает диакритические знаки, \p .

boolean valid = input.matches("\\p+"); 

Источник

Java — какой лучший способ проверить, содержит ли STRING только определенные символы?

У меня есть эта проблема: у меня есть String , но мне нужно убедиться, что она содержит только буквы A-Z и цифры 0-9. Вот мой текущий код:

boolean valid = true; for (char c : string.toCharArray()) < int type = Character.getType(c); if (type == 2 || type == 1 || type == 9) < // the character is either a letter or a digit >else < valid = false; break; >> 

если вы не хотите использовать regex использовать предопределенную функцию Character класса — оболочки. Преобразуйте вашу строку в toCharArray затем используйте цикл и используйте предопределенные методы.

8 ответов

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

boolean valid = true; char[] a = s.toCharArray(); for (char c: a) < valid = ((c >= 'a') && (c = 'A') && (c = '0') && (c > return valid; 
public static void main(String[] args) < String[] testStrings = ; long startNanos = System.nanoTime(); for (String testString: testStrings) < isAlphaNumericOriginal(testString); >System.out.println("Time for isAlphaNumericOriginal: " + (System.nanoTime() - startNanos) + " ns"); startNanos = System.nanoTime(); for (String testString: testStrings) < isAlphaNumericFast(testString); >System.out.println("Time for isAlphaNumericFast: " + (System.nanoTime() - startNanos) + " ns"); startNanos = System.nanoTime(); for (String testString: testStrings) < isAlphaNumericRegEx(testString); >System.out.println("Time for isAlphaNumericRegEx: " + (System.nanoTime() - startNanos) + " ns"); startNanos = System.nanoTime(); for (String testString: testStrings) < isAlphaNumericIsLetterOrDigit(testString); >System.out.println("Time for isAlphaNumericIsLetterOrDigit: " + (System.nanoTime() - startNanos) + " ns"); > private static boolean isAlphaNumericOriginal(String s) < boolean valid = true; for (char c : s.toCharArray()) < int type = Character.getType(c); if (type == 2 || type == 1 || type == 9) < // the character is either a letter or a digit >else < valid = false; break; >> return valid; > private static boolean isAlphaNumericFast(String s) < boolean valid = true; char[] a = s.toCharArray(); for (char c: a) < valid = ((c >= 'a') && (c = 'A') && (c = '0') && (c > return valid; > private static boolean isAlphaNumericRegEx(String s) < return Pattern.matches("[\\dA-Za-z]+", s); >private static boolean isAlphaNumericIsLetterOrDigit(String s) < boolean valid = true; for (char c : s.toCharArray()) < if(!Character.isLetterOrDigit(c)) < valid = false; break; >> return valid; > 

Производит этот вывод для меня:

Time for isAlphaNumericOriginal: 164960 ns Time for isAlphaNumericFast: 18472 ns Time for isAlphaNumericRegEx: 1978230 ns Time for isAlphaNumericIsLetterOrDigit: 110315 ns 

Источник

Читайте также:  Java как скомпилировать пакет

Метод charAt() в Java

Java-университет

charAt() в Java - 1

Есть множество базовых методов, которые мы регулярно используем, даже не задумываясь. Ну а что, если задуматься и посмотреть, каким образом реализованы некоторые простые, на первый взгляд, методы? Думаю, это поможет нам стать на шаг ближе к Java) Представим ситуацию, в которой нам нужно вытащить определенный символ в какой-то строке. Как мы это можем сделать в Java? Например, с помощью вызова метода Java String charAt . О методе charAt() мы и поговорим в сегодняшней статье.

Синтаксис

char charAt(int index) возвращает значение char по указанному индексу. Индекс колеблется от 0 до length()-1 . То есть, первое char значение последовательности находится в index 0 , следующее — в index 1 и т.д., как и в случае с индексацией массива.

Пример

 public static void main(String[] args)

В первой строке берется первый символ, во второй — второй, и так далее. Так как здесь используется не println , а print , без перехода на новую строку, мы получим вывод в консоль:

Если char под заданным индексом представлен в виде юникода, результатом работы метода java charAt() будет символ, который представляет данный юникод:

 System.out.println("J\u0061vaRush".charAt(1)); 

Что “под капотом”

charAt() в Java - 2

Как же оно работает, спросите вы?Дело в том, что в каждом объекте String есть массив byte с байтами элементов данной строки:

 public char charAt(int index) < if (isLatin1()) < return StringLatin1.charAt(value, index); >else < return StringUTF16.charAt(value, index); >> 

isLatin1 — флаг, указывающий на то, есть ли в нашей строке только латинские символы или нет. От это зависит, какой метод будет вызываться далее.

isLatin1 = true

Если в строке есть только латинские символы, вызывается статический метод charAt класса StringLatin1 :

 public static char charAt(byte[] value, int index) < if (index < 0 || index >= value.length) < throw new StringIndexOutOfBoundsException(index); >return (char)(value[index] & 0xff); > 
  • & расширяет для двоичной операции для byte побитово
  • 0xff ничего не делает, но & требует аргумент
  • (char) приводит данные по таблице ASCII к char

isLatin1 = false

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

 public static char charAt(byte[] value, int index)
 public static void checkIndex(int off, byte[] val)
 static void checkIndex(int index, int length) < if (index < 0 || index >= length) < throw new StringIndexOutOfBoundsException("index " + index + ", length " + length); >> 

Здесь, собственно, происходит проверка на допустимость индекса: опять же, положительный ли он либо ноль, и не выходил ли он за пределы массива. Но в классе StringUTF16 в методе charAt более интересным будет вызов второго метода:

Читайте также:  Mbstring php extension was

charAt() в Java - 3Приступим же к разбору, что тут собственно происходит. Первым делом в начале метода идёт ещё одна проверка допустимости индекса. Чтобы понять происходящее далее, нужно уяснить: когда не латинский символ попадает в массив value , его представляют два байта (две ячейки массива). Если у нас есть строка из двух кириллических символов — “ав”, то:

  • для ‘а’ это пара байтов — 48 и 4;
  • для ‘в’ — 50 и 4.

То есть, если мы создадим строку “ав”, у нее будет массив value — Собственно, в этом методе и идёт работа с двумя ячейками массива value . Поэтому дальше идёт сдвиг index . Мы запрашиваем третий элемент строки, и тогда двоичное представление — 00000000 00000011. При сдвиге на 1, мы получим 00000000 00000110, то есть index = 6 . Чтобы освежить знания по побитовым операциям, можешь почитать вот эту статью.charAt() в Java - 4Также мы видим некоторые переменные: HI_BYTE_SHIFT в данном случае равно 0. LO_BYTE_SHIFT в данном случае равно 8. В последней строке данного метода:

  1. Берется элемент из массива value и побитово сдвигается на HI_BYTE_SHIFT , то есть 0, при этом увеличивая index +1 . В примере с строкой «абвг» , шестой байт — 51 — так бы и остался, но при этом увеличивается индекс до 7.
  2. После этого берется следующий элемент массива и так же побитово сдвигается, но на LO_BYTE_SHIFT , то есть на 8 битов. И если у нас это был байт 4, который имеет двоичное представление — 00000000 00000100, то после сдвига на 8 битов у нас будет 00000100 00000000. Если целым числом — 1024.
  3. Далее для этих двух значений следует операция | (OR) . И если у нас были байты 51 и 1024, которые в двоичном представлении выглядели как 00000000 00110011 и 00000100 00000000, то после операции OR мы получим 00000100 00110011, что значит число 1075 в десятичной системе. Ну и в конце концов, переводится число 1075 в тип char, а при переводе int -> char используется таблица ASCII, и в ней под номером 1075 стоит символ ‘г’.

Собственно, таким образом мы и получим ‘г’ как результат работы метода charAt() в Java-программировании.

Источник

Оцените статью