Одиночные элементы очень полезны, и использование их не находится в и себя антишаблон. Однако они получили плохую репутацию в основном, потому что они вынуждают любой код потребления подтвердить, что они - одиночный элемент для взаимодействия с ними. Это означает, нужны ли Вам когда-нибудь к "un-Singletonize" они, влияние на Вашу кодовую базу может быть очень значительным.
Вместо этого я предложил бы любое сокрытие Singleton позади фабрики. Тот путь, если необходимо изменить поведение инстанцирования сервиса в будущем, можно просто изменить фабрику, а не все типы, которые используют Singleton.
Еще лучше, используйте инверсию контейнера управления! Большинство из них позволяет Вам разделять поведение инстанцирования от реализации Ваших классов.
Это должно сработать:
(?<=\[p2\]).+?(?=\[\/p2\])
Я добавил вопросительный знак, чтобы квантификатор не был жадным.
Вместо использования модификатора регулярного выражения вы можете использовать стандартный модификатор соответствия стиля perl и добавить? после + или *, чтобы указать, что эта конкретная часть не является жадной. Упоминалось выше, но может помочь конкретность.