Поле LITERAL
Поле LITERAL класса Pattern представляет собой флаг
(константу типа int), который передается вторым параметром
в метод compile. Когда этот флаг установлен,
регулярное выражение воспринимается буквально: все метасимволы
(такие как ., *, +, ?, [, ],
(, ), {, }, ^, $, |, \)
теряют свое специальное значение и ищутся как обычные символы.
В первый параметр метода compile мы передаем строку
с регулярным выражением, во второй - флаг Pattern.LITERAL.
Синтаксис
Pattern.compile(regex, Pattern.LITERAL)
Пример
Давайте сравним работу с флагом LITERAL и без него.
Строка "a.c" без флага трактуется как шаблон, где
точка означает любой символ. С флагом LITERAL точка
ищется буквально:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String regex = "a.c";
String str = "abc";
Pattern p1 = Pattern.compile(regex);
Matcher m1 = p1.matcher(str);
System.out.println(m1.matches());
Pattern p2 = Pattern.compile(regex, Pattern.LITERAL);
Matcher m2 = p2.matcher(str);
System.out.println(m2.matches());
}
}
Результат выполнения кода:
true
false
Пример
Давайте найдем строку, содержащую специальные символы
"[abc]", которые в обычном режиме были бы
интерпретированы как символьный класс:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String regex = "[abc]";
String str = "xyz[abc]123";
Pattern p = Pattern.compile(regex, Pattern.LITERAL);
Matcher m = p.matcher(str);
if (m.find())
{
System.out.println("Found at index: " + m.start());
}
else
{
System.out.println("Not found");
}
}
}
Результат выполнения кода:
"Found at index: 3"
Пример
Давайте проверим, как флаг LITERAL влияет
на поиск символа обратного слеша, который обычно
является экранирующим символом:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String regex = "\\d";
String str = "\\d";
Pattern p = Pattern.compile(regex, Pattern.LITERAL);
Matcher m = p.matcher(str);
System.out.println(m.matches());
}
}
Результат выполнения кода:
true