Как мне сопоставить символы Юникода в Java - PullRequest
8 голосов
/ 23 июня 2010

Я пытаюсь сопоставить символы Юникода в Java.

Входная строка: informa

Соответствующая строка: informátion

Пока я пробовал это:

Pattern p= Pattern.compile("informa[\u0000-\uffff].*", (Pattern.UNICODE_CASE|Pattern.CANON_EQ|Pattern.CASE_INSENSITIVE));
    String s = "informátion";
    Matcher m = p.matcher(s);
    if(m.matches()){
        System.out.println("Match!");
    }else{
        System.out.println("No match");
    }

Выдается как "Нет совпадений".Есть идеи?

Ответы [ 3 ]

12 голосов
/ 23 июня 2010

Термин «символы Юникода» недостаточно конкретен.Он будет соответствовать каждому символу, который находится в диапазоне Unicode, таким образом, также "нормальным" символам.Однако этот термин очень часто используется, когда один на самом деле означает «символы, которые не находятся в печатаемом диапазоне ASCII ».

В терминах регулярного выражения это будет [^\x20-\x7E].

boolean containsNonPrintableASCIIChars = string.matches(".*[^\\x20-\\x7E].*");

В зависимости от того, что вы хотели бы сделать с этой информацией, вот несколько полезных последующих ответов:

6 голосов
/ 23 июня 2010

Это потому, что informa вообще не является подстрокой informátion?

Как будет работать ваш код, если вы удалите последние a из informa в своем регулярном выражении?

1 голос
/ 01 октября 2015

Звучит так, как будто вы хотите сопоставлять буквы, игнорируя диакритические знаки.Если это правильно, то нормализуйте свои строки в форме NFD, удалите диакритические знаки и затем выполните поиск.

String normalized = java.text.Normalizer.normalize(textToSearch, java.text.Normalizer.Form.NFD);
String withoutDiacritical = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
// Search code goes here...

Чтобы узнать больше о NFD:

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