Каждая версия вашего кода имеет свою проблему.
Для версии 2 (inifinite l oop): вы создаете совпадение в l oop. Это означает, что на каждой итерации будет появляться новый сопоставитель, начиная с начала вашей строки. Таким образом, вызов find
всегда будет возвращать один и тот же результат, если таковой имеется.
Ваше первое решение - это то, что вам нужно сделать, один раз создать средство сравнения, а затем использовать его, вызывая find
в * 1036. *.
Проблема в том, что вы звоните find
в 2 разных местах. Сначала в блоке if
, чтобы увидеть, есть ли совпадения в вашей строке, затем в l oop.
Что, если строка содержит только 1 результат поиска?
- Результат возвращается в блоке
if
countCount
установлен на 0
- В то время как l oop пытается найти следующий матч, но его нет
- код печатает
COUNT : 0
Если вы не сбрасываете совпадения перед циклом, вам нужно посчитать результат из блока if
в ваш счетчик. Вот решение с минимальными изменениями:
final static String FILE_BEGINNING_PATTERN = "^(,Share %)";
public static void main(String[] args) {
String str = ",Share %,\"Date Purchased\",Display Name,Address,Phone,Fax,Mobile,Email,";
Matcher beginningFileMatcher = Pattern.compile(FILE_BEGINNING_PATTERN).matcher(str);
int count = 0;
if (beginningFileMatcher.find()) {
System.out.println("Regex match!");
count++; // already a match, increment the counter
}
while (beginningFileMatcher.find()) {
count++;
System.out.println("COUNT ++++++++++++++ :" + count);
}
}
Другим способом было бы удалить блок if и использовать только while l oop.