Поле UNICODE_CASE
Поле UNICODE_CASE класса Pattern представляет собой
флаг регулярного выражения, который включает режим
Unicode-совместимого сопоставления регистра. Когда этот флаг
установлен, регистр символов учитывается в соответствии с
правилами Unicode, а не только для символов латинского алфавита.
Флаг особенно полезен в паре с флагом CASE_INSENSITIVE,
поскольку сам по себе UNICODE_CASE не отключает
чувствительность к регистру, а лишь расширяет её на весь
диапазон Unicode. Значение поля равно 64 (в
шестнадцатеричном виде 0x40).
Флаг передаётся вторым параметром в методы compile
класса Pattern или устанавливается через битовую маску
при создании шаблона. Без флага UNICODE_CASE
сопоставление регистра выполняется только для символов
ASCII, что может приводить к неверным результатам при работе
с кириллицей, греческим, арабским и другими алфавитами.
Синтаксис
Pattern.compile(regex, Pattern.UNICODE_CASE)
Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)
Пример
Давайте сравним работу флага CASE_INSENSITIVE без
флага UNICODE_CASE и вместе с ним на строке с
кириллицей:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String regex = "привет";
String str = "ПРИВЕТ";
Pattern p1 = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m1 = p1.matcher(str);
System.out.println(m1.find());
Pattern p2 = Pattern.compile(regex,
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher m2 = p2.matcher(str);
System.out.println(m2.find());
}
}
Результат выполнения кода:
false
true
Пример
Давайте найдём все вхождения слова в разных регистрах
кириллицы с использованием флага UNICODE_CASE:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String regex = "тест";
String str = "Тест ТЕСТ тест ТеСт";
Pattern p = Pattern.compile(regex,
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher m = p.matcher(str);
while (m.find())
{
System.out.println(m.group());
}
}
}
Результат выполнения кода:
"Тест"
"ТЕСТ"
"тест"
"ТеСт"
Пример
Давайте проверим значение флага UNICODE_CASE
и убедимся, что оно соответствует константе 64:
import java.util.regex.Pattern;
public class Main
{
public static void main(String[] args)
{
System.out.println(Pattern.UNICODE_CASE);
Pattern p = Pattern.compile("abc",
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
int flags = p.flags();
boolean enabled = (flags & Pattern.UNICODE_CASE) != 0;
System.out.println(enabled);
}
}
Результат выполнения кода:
64
true
Смотрите также
-
поле
CASE_INSENSITIVE,
которое включает игнорирование регистра -
поле
UNICODE_CASE,
которое расширяет игнорирование регистра на Unicode -
метод
compile,
который компилирует регулярное выражение с флагами -
метод
flags,
который возвращает флаги шаблона