? означает, что число повторений 0 или 1. Т.е. символ не обязателен, может быть, а может и нет.

Пример
Есть некая строка найти в ней все числа. Числа м.б. как целые, так и дробные.

String str = "12321 74232.47 11111 2";
ArrayList<String> list = new ArrayList<>();
Pattern p = Pattern.compile("\\d+(\\.\\d+)?");
Matcher m = p.matcher(str);
		

while(m.find()) {
    list.add(m.group());
}
		 
System.out.println("The data found " + list);
System.out.println("List length is " + list.size());

Вывод на консоль:

The data found [12321, 74232.47, 11111, 2]
List length is 4

Рассмотрим теперь такое понятие как «жадность», которое по дефолту использует Java.

String str = "<Doc> <DocumentID>231F9</DocumentID>  <userName>Ivanov</userName></Doc>";

Выражение

<.*>

найдет все строку, т.к. строка начинается с <, далее любое количество символов, а заканчивается >.
Что же найдет выражение

<.*?> 

Мы просто найдем все теги, т.к. работаем не по «жадному» алгоритму

 [<Doc>, <DocumentID>, </DocumentID>, <userName>, </userName>, </Doc>]
Реклама