Для відповідності від A до Z ми будемо використовувати регулярний вираз:
[A-Za-z]
Як дозволити регулярному виразу відповідати символам utf8, введеним користувачем? Наприклад, китайські слова, такі як 环保 部
Відповіді:
Те, що ви шукаєте, - це властивості Unicode.
наприклад, \p{L}
це будь-який лист з будь-якої мови
Тож регулярний вираз, який відповідає такому китайському слову, може бути чимось подібним
\p{L}+
Таких властивостей багато, докладніше див. Regular-expressions.info
Інший варіант - використовувати модифікатор
Pattern.UNICODE_CHARACTER_CLASS
У Java 7 з'явилася нова властивість, Pattern.UNICODE_CHARACTER_CLASS
що включає версію Unicode попередньо визначених класів символів Перегляньте мою відповідь тут для отримання додаткової інформації та посилань
Ви могли б зробити щось подібне
Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);
і \w
збігався б з усіма літерами та усіма цифрами з будь-яких мов (і, звичайно, деяким словом, що поєднує символи, наприклад _
).
Щоб зіставити окремі символи, ви можете просто включити їх до класу символів або як літерали, або за допомогою \u03FB
синтаксису.
Очевидно, що часто ви не можете перерахувати всі дозволені символи на ідеографічних мовах. Щоб зробити регулярний вираз обробкою символів Unicode відповідно до їх типу або блоку коду, підтримуються різні інші екрани, визначені тут . Подивіться на розділ "Підтримка Unicode", зокрема посилання на Character
клас і на сам стандарт Unicode.
[a-z]+
або [a-z]{3}
або навіть [a-z]{2,10}
. Різне лише те, що ви дозволяєте в класі символів, до якого застосовується квантор.
Щоб звернутися до підтримки NLS та уникнути прийняття англійського спеціального символу, ми можемо використати шаблон нижче ...
[a-zA-Z0-9 \ u0080- \ u9fff] * +
Для довідкового коду UTF: http://www.utf8-chartable.de/unicode-utf8-table.pl
Фрагмент коду:
String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ";
String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ";
String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯";
String engChinesStr = "ABC導字會";
Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern
.compile("[a-zA-Z0-9 \\u0c00-\\u0c7f]*+");
System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels)
.matches());
Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern
.compile("[a-zA-Z0-9 \\u4e00-\\u9fff]*+");
Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern
.compile("[a-zA-Z0-9 \\u0080-\\u9fff]*+");
System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr)
.matches());
char
типомchar
тип неявно UTF-16Unicode - це універсальний набір символів, і UTF-8 може описувати все це (включаючи контрольні символи, розділові знаки, символи, літери тощо). Вам потрібно буде більш точно визначити, що ви хочете включити, а що ви хочете виключити. Регулярні вирази Java використовують \p{category}
синтаксис для узгодження кодових точок за категоріями . Див стандарт Unicode для списку категорій.
Якщо ви хочете ідентифікувати та відокремити слова в послідовності ідеографів, вам потрібно буде розглянути більш досконалий API. Я б почав з BreakIterator
типу.
UNICODE_CHARACTER_CLASS
прапором або вбудованим(?U)
. Дивіться stackoverflow.com/questions/4304928/…