Регулярний вираз Java для підтримки Unicode?


80

Для відповідності від A до Z ми будемо використовувати регулярний вираз:

[A-Za-z]

Як дозволити регулярному виразу відповідати символам utf8, введеним користувачем? Наприклад, китайські слова, такі як 环保 部


2
У Java 7 регулярний вираз Unicode підтримується UNICODE_CHARACTER_CLASSпрапором або вбудованим (?U). Дивіться stackoverflow.com/questions/4304928/…
Аластер Маккормак

Відповіді:


120

Те, що ви шукаєте, - це властивості 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збігався б з усіма літерами та усіма цифрами з будь-яких мов (і, звичайно, деяким словом, що поєднує символи, наприклад _).


Щоб відповідати таким словам, як Da̱nx̱a̱laga̱litła̱n, чи потрібно нам доручати збігу шаблонів поєднувати діакритику?
Дейв Джарвіс,

9

Щоб зіставити окремі символи, ви можете просто включити їх до класу символів або як літерали, або за допомогою \u03FBсинтаксису.

Очевидно, що часто ви не можете перерахувати всі дозволені символи на ідеографічних мовах. Щоб зробити регулярний вираз обробкою символів Unicode відповідно до їх типу або блоку коду, підтримуються різні інші екрани, визначені тут . Подивіться на розділ "Підтримка Unicode", зокрема посилання на Characterклас і на сам стандарт Unicode.


як матачувати кілька символів utf8, введених на прикладі користувача 环保 部, оскільки користувач буде вводити випадково кількість символів
комета

1
Це так само , як відповідність кілька латинських символів: [a-z]+або [a-z]{3}або навіть [a-z]{2,10}. Різне лише те, що ви дозволяєте в класі символів, до якого застосовується квантор.
Kilian Foth

9

Щоб звернутися до підтримки 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());

3
  • API регулярного виразу Java працює над charтипом
  • charтип неявно UTF-16
  • якщо у вас є дані UTF-8, вам потрібно буде перекодувати їх у UTF-16 на вході, якщо це ще не зроблено

Unicode - це універсальний набір символів, і UTF-8 може описувати все це (включаючи контрольні символи, розділові знаки, символи, літери тощо). Вам потрібно буде більш точно визначити, що ви хочете включити, а що ви хочете виключити. Регулярні вирази Java використовують \p{category}синтаксис для узгодження кодових точок за категоріями . Див стандарт Unicode для списку категорій.

Якщо ви хочете ідентифікувати та відокремити слова в послідовності ідеографів, вам потрібно буде розглянути більш досконалий API. Я б почав з BreakIteratorтипу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.