- Проверить строку, содержит ли она только латинские символы?
- 6 ответы
- Проверьте строку, содержит ли она только латинские символы?
- 6 ответов
- Проверка символов на кириллицу и латиницу
- Написать программу, проверяющую, является ли строка S допустимым идентификатором
- Метод charAt() в Java
- Синтаксис
- Пример
- Что “под капотом”
- isLatin1 = true
- isLatin1 = false
Проверить строку, содержит ли она только латинские символы?
Я разрабатываю приложение GWT, где пользователь может вводить свои данные на японском языке. Но «идентификатор пользователя» и «пароль» должны содержать только английские символы (латинский алфавит). Как проверить строки для этого?
Есть английские символы. Я думал, что символы английского языка взяты из латинского алфавита. — Matt S.
ну, если он имеет в виду символы ascii, я бы назвал их английскими символами .. или американскими. — Tor Valamo
6 ответы
Вы можете использовать String#matches() с немного регулярное выражение для этого. Латинские символы покрываются \w .
boolean valid = input.matches("\\w+");
Это, кстати, также касается чисел и символа подчеркивания _ . Не уверен, что это вредит. В противном случае вы можете просто использовать [A-Za-z]+ .
Если вы хотите прикрыть диакритические символы также (ä, é, ò и т. д., это по определению также латинские символы), тогда вам нужно сначала нормализовать их и избавиться от диакритических знаков перед сопоставлением просто потому, что нет (задокументировано) регулярное выражение, которое охватывает диакритические знаки.
String clean = Normalizer.normalize(input, Form.NFD).replaceAll("\\p+", ""); boolean valid = clean.matches("\\w+");
Обновление ПО: в Java есть недокументированное регулярное выражение, которое также охватывает диакритические знаки, \p .
boolean valid = input.matches("\\p+");
Проверьте строку, содержит ли она только латинские символы?
Я разрабатываю приложение GWT, где пользователь может вводить свои данные на японском языке. Но «идентификатор пользователя» и «пароль» должны содержать только английские символы (латинский алфавит). Как проверить строки для этого?
Хорошо, если он имеет в виду символы ascii, тогда я бы назвал это английскими символами . или американскими.
6 ответов
Вы можете использовать String#matches() с битом regex для этого. Латинские символы охватываются \w .
Так что это должно сделать:
boolean valid = input.matches("\\w+");
Это, кстати, также охватывает числа и знак подчеркивания _ . Не уверен, что это вредит. В противном случае вы можете просто использовать вместо него [A-Za-z]+ .
Если вы хотите охватить также диакритические символы (ä, é, ò и т. Д., Те являются по определению также латинскими символами), то вам нужно сначала нормализовать их и избавиться от диакритических знаков перед сопоставлением просто потому, что нет (задокументированного) регулярного выражения, которое покрывает диакритические знаки.
String clean = Normalizer.normalize(input, Form.NFD).replaceAll("\\p+", ""); boolean valid = clean.matches("\\w+");
Обновление : в Java есть недокументированное регулярное выражение, которое также охватывает диакритические знаки, \p .
boolean valid = input.matches("\\p+");
Проверка символов на кириллицу и латиницу
Здравствуйте, помогите найти ошибку. Задание — следующее:
Пользователь вводит с клавиатуры букву, программа должна определить, в какой раскладке введена буква, в латинской или кириллице. Вывести в консоль: «латиница» если буква введена латиницей, и «кириллица» если буква относится к кириллическому алфавиту. Если введена цифра а не буква, вывести «цифра». Если символ не относится ни к буквам ни к цифрам вывести «невозможно определить». Программа не должна зависеть от регистра букв.
Все работает, однако в консоле после определения кириллицы и латиницы срабатывает условие else. При определении цифры этого не происходит. Подскажите пожалуйста в чем причина.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public static void main(String[]args) { Scanner sc = new Scanner(System.in); System.out.println("Введите символ:"); String simvol = sc.nextLine(); Pattern patlatletter = Pattern.compile("[a-zA-Z]"); Matcher matlatletter = patlatletter.matcher(simvol); Pattern patkirletter = Pattern.compile("[а-яА-Я]"); Matcher matkirletter = patkirletter.matcher(simvol); Pattern patnumber = Pattern.compile("9"); Matcher matnumber = patnumber.matcher(simvol); if(matlatletter.matches()==true) { System.out.println("Латиница"); } if(matkirletter.matches()==true) { System.out.println("Кирилица"); } if(matnumber.matches()==true) { System.out.println("Цифра"); } else { System.out.println("Невозможно определить"); } }
Написать программу, проверяющую, является ли строка S допустимым идентификатором
Написать программу, проверяющую, является ли строка S допустимым идентификатором, то есть непустой строкой, которая содержит только латинские буквы, цифры и символ подчеркивания «_» и не начинается с цифры. Если S является допустимым идентификатором, то функция возвращает 0. Если S является пустой строкой, то возвращается –1, если S начинается с цифры, то возвращается –2. Если S содержит недопустимые символы, то возвращается номер первого недопустимого символа.
Сам я уже пытался сделать, что-то подобное, хотя бы начать, но отсутствие вообще какого-то опыта и знаний сказывается, ничего подобного в интернете не могу найти именно на джава, но видел как было такое же задание на С++ и других языках.
Вот моя попытка (нерабочая)
ругается на строку с «if», чтобы я не делал с ней, всё равно разные ошибки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
package identificator; import java.util.Scanner; import java.util.regex.Pattern; import static java.lang.Math.*; public class var1 { public static regular, with> void main(String[] args, Object starts) { Scanner input = new Scanner(System.in); System.out.println("Написать программу, проверяющую, является ли строка S\r\n" + "допустимым идентификатором, то есть непустой строкой, которая содержит\r\n" + "только латинские буквы, цифры и символ подчеркивания «_» и не начинается с\r\n" + "цифры. Если S является допустимым идентификатором, то функция возвращает 0. \r\n" + "Если S является пустой строкой, то возвращается –1, если S начинается с цифры, то\r\n" + "возвращается –2. Если S содержит недопустимые символы, то возвращается номер\r\n" + "первого недопустимого символа "); System.out.println("Введите строку"); String s = input.toString(); double c; if (boolean h isEmpty()); { System.out.println("-1"); } } private static boolean isEmpty() { // TODO Auto-generated method stub return false; }}
Метод charAt() в Java
Есть множество базовых методов, которые мы регулярно используем, даже не задумываясь. Ну а что, если задуматься и посмотреть, каким образом реализованы некоторые простые, на первый взгляд, методы? Думаю, это поможет нам стать на шаг ближе к 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));
Что “под капотом”
Как же оно работает, спросите вы?Дело в том, что в каждом объекте 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 более интересным будет вызов второго метода:
Приступим же к разбору, что тут собственно происходит. Первым делом в начале метода идёт ещё одна проверка допустимости индекса. Чтобы понять происходящее далее, нужно уяснить: когда не латинский символ попадает в массив value , его представляют два байта (две ячейки массива). Если у нас есть строка из двух кириллических символов — “ав”, то:
- для ‘а’ это пара байтов — 48 и 4;
- для ‘в’ — 50 и 4.
То есть, если мы создадим строку “ав”, у нее будет массив value — Собственно, в этом методе и идёт работа с двумя ячейками массива value . Поэтому дальше идёт сдвиг index . Мы запрашиваем третий элемент строки, и тогда двоичное представление — 00000000 00000011. При сдвиге на 1, мы получим 00000000 00000110, то есть index = 6 . Чтобы освежить знания по побитовым операциям, можешь почитать вот эту статью.Также мы видим некоторые переменные: HI_BYTE_SHIFT в данном случае равно 0. LO_BYTE_SHIFT в данном случае равно 8. В последней строке данного метода:
- Берется элемент из массива value и побитово сдвигается на HI_BYTE_SHIFT , то есть 0, при этом увеличивая index +1 . В примере с строкой «абвг» , шестой байт — 51 — так бы и остался, но при этом увеличивается индекс до 7.
- После этого берется следующий элемент массива и так же побитово сдвигается, но на LO_BYTE_SHIFT , то есть на 8 битов. И если у нас это был байт 4, который имеет двоичное представление — 00000000 00000100, то после сдвига на 8 битов у нас будет 00000100 00000000. Если целым числом — 1024.
- Далее для этих двух значений следует операция | (OR) . И если у нас были байты 51 и 1024, которые в двоичном представлении выглядели как 00000000 00110011 и 00000100 00000000, то после операции OR мы получим 00000100 00110011, что значит число 1075 в десятичной системе. Ну и в конце концов, переводится число 1075 в тип char, а при переводе int -> char используется таблица ASCII, и в ней под номером 1075 стоит символ ‘г’.
Собственно, таким образом мы и получим ‘г’ как результат работы метода charAt() в Java-программировании.