Я просто нашел ошибку в какой-то код, который я не писал, и я немного удивлен:Не должны ли статические шаблоны быть статическими?
Pattern pattern = Pattern.compile("\\d{1,2}.\\d{1,2}.\\d{4}");
Matcher matcher = pattern.matcher(s);
Несмотря на то, что этот код не плохо на входных данных мы получаем (потому что он пытается найти даты в формате 17.01.2011 и получает обратно вещи, как 10396/2011, а затем разбился, потому что не может разобрать дату, но что на самом деле не суть этого вопроса;) Интересно:
не является одним из Pa ttern.compile - оптимизация скорости (путем предварительной компиляции регулярных выражений)?
не все «статические» шаблоны должны быть всегда скомпилирован в статический шаблон?
Есть так много примеров, все вокруг в Интернет, где та же картина всегда перекомпилированный с помощью Pattern.compile, что я начинаю задаваться вопросом, если я вижу вещи или нет.
Не (при условии, что строка является статическим и, следовательно, не динамически строится):
static Pattern pattern = Pattern.compile("\\d{1,2}.\\d{1,2}.\\d{4}");
всегда preferrable над нестатической ссылкой шаблон?
Ошибка в шаблоне заключается в том, что '.' соответствует чему угодно. Используйте '\ .' (или, скорее,' \\. '; Первую обратную косую черту для Java), чтобы исправить это. –
@ Donal Fellows: Большое спасибо, я знаю, что знаю, я просто хотел вставить сломанный код, когда прочитал. Для меня есть ** два ** WTF в этом коде: во-первых, что компиляция шаблона не является статичной, а затем во-вторых, что это своего рода грубая проблема * regexp-now-you-have-two-problems *: – Gugussee
Все ответы, которые говорят, что компиляция статически лучше, верны. Но здесь есть немного преждевременная оптимизация. Если вы видите много примеров в Интернете с использованием шаблона Pattern.compile нестатически, это, вероятно, потому, что он просто не является узким местом очень часто и может быть чуть-чуть легче читать или поддерживать этот путь. Всегда измерьте перед оптимизацией, иначе вы можете обнаружить, что время, потраченное на изучение проблемы, было больше, чем все время процессора, которое ваша программа когда-либо проведет в Pattern.compile, вместе взятые :-). – Avi