Поле DOTALL
Поле DOTALL класса Pattern представляет собой
флаг регулярного выражения, который включает режим
«точка соответствует всему». По умолчанию метасимвол
точки . в регулярных выражениях Java совпадает
с любым символом, кроме символов перевода строки
(\n, \r и других терминаторов строк).
Когда флаг DOTALL установлен, точка начинает
совпадать и с этими символами тоже.
Поле имеет тип int и хранит битовую маску
значения 32. Его можно передать вторым параметром
в метод compile класса Pattern, а также
использовать во флагах, встроенных прямо в регулярное
выражение, например (?s).
Синтаксис
Pattern.compile(regex, Pattern.DOTALL)
Либо через встроенный флаг внутри самого выражения:
(?s)regex
Пример
Давайте сравним поведение точки без флага и с флагом
DOTALL. Сначала попробуем найти подстроку,
начинающуюся на a и заканчивающуюся на c,
между которыми стоит любой символ:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String str = "a\nc";
Pattern p = Pattern.compile("a.c");
Matcher m = p.matcher(str);
System.out.println(m.find());
}
}
Результат выполнения кода:
false
Пример
Теперь добавим флаг DOTALL и повторим поиск:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String str = "a\nc";
Pattern p = Pattern.compile("a.c", Pattern.DOTALL);
Matcher m = p.matcher(str);
System.out.println(m.find());
}
}
Результат выполнения кода:
true
Пример
Того же эффекта можно добиться встроенным флагом
(?s) прямо в регулярном выражении:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String str = "a\nc";
Pattern p = Pattern.compile("(?s)a.c");
Matcher m = p.matcher(str);
System.out.println(m.find());
}
}
Результат выполнения кода:
true
Пример
Давайте найдём все многострочные блоки между открывающей и закрывающей фигурными скобками в многострочной строке:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
public static void main(String[] args)
{
String str = "{abc\ndef}\n{123\n45}";
Pattern p = Pattern.compile("\\{.*?\\}", Pattern.DOTALL);
Matcher m = p.matcher(str);
while (m.find())
{
System.out.println(m.group());
}
}
}
Результат выполнения кода:
"{abc
def}"
"{123
45}"