2015-08-20 6 views
2

Я пытаюсь выполнять операции регулярного выражения в Java. Но когда я ищу в турецком тексте, у меня проблемы. Например;Как я могу использовать Java Regex для турецких символов в UTF-8

Search Text = "Ahmet Yıldırım" or "Esin AYDEMİR" 

//The e-mail stated in part(Ex: [email protected]) , trying to look in name. 
Regex Strings = "yildirim" or "aydemir". 

искомый текст динамически changing.Therefore, как я могу решить эту проблему с помощью Java регулярных выражений шаблона. Или Как преобразовать турецкие символы (Ex: AYDEMİR convert to AYDEMIR или Yıldırım -> Yildirim).

К сожалению, о моих ошибках ... GRAMMER

+0

Хорошо, но как преобразовать в "yildirim" в "y [iı] ld [ıi] r [ıi] m". Динамично, в каждом тексте («İÖÜŞÇĞıöüşç»). Как я могу определить этого персонажа. И конвертировать в («IOUSCGiouscg») –

ответ

6

Использование Pattern.CASE_INSENSITIVE и Pattern.UNICODE_CASE флаг:

Pattern p = Pattern.compile("yildirim", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 

Demo on ideone

Pattern.CASE_INSENSITIVE по умолчанию соответствует только регистронезависимо для символов US-ASCII набор символов. Pattern.UNICODE_CASE изменяет поведение, чтобы он не учитывал регистр символов для всех символов Unicode.

Обратите внимание, что соответствие Unicode без учета регистра в Java regex выполняется с учетом нечувствительности к культуре. Поэтому ı, i, I, İ считаются одинаковыми.

В зависимости от вашего случая использования, вы можете захотеть использовать Pattern.LITERAL, если вы хотите, чтобы отключить все метасимволы в шаблоне, или только избежать буквенные части шаблона с Pattern.quote()

+0

Вы знаете способ достижения такого же поведения в .NET? Просто любопытно. –

+0

@stribizhev: Это хороший вопрос. Я думал, что 'IgnoreCase | CultureInvariant' будет работать, но оказывается, что это не так. Возможно, вы захотите задать новый вопрос? (Я также хочу знать ответ) – nhahtdh

+0

@stribizhev: Собственно, в .NET мы можем решить эту проблему, установив соответствующую культуру (в данном случае, турецкую), хотя это означает, что вы должны хотя бы знать язык перед его обработкой. – nhahtdh

4

Вопрос в your comment является более сложным, чем оригинал один.

Вы можете использовать

string=Normalizer.normalize(string, Normalizer.Form.NFD).replaceAll("\\p{Mn}", ""); 

конвертировать "İÖÜŞÇĞıöüşçğ" в "IOUSCGıouscg", который уже достаточно для случая нечувствительный матч, как отметил out by nhahtdh. Если вы хотите выполнить совпадение с регистром, вы должны добавить .replace('ı', 'i') в соответствие с ı с i.

+0

Спасибо, ваш совет. Я думаю, что у меня была небольшая проблема в объяснении моей проблемы. Но я решил проблему с этим ответом. –

+0

@Holger: Как вы получаете ссылку на комментарий? Благодарю. – Sabuncu

+1

@Sabuncu: щелкните правой кнопкой мыши по дате/времени рядом с именем пользователя и выберите «местоположение ссылки для копирования». – Holger