The problem is probably the and $ characters you have at the start and end of the regexp. meaning "start of the string" and $ meaning "end of the string", so the regexp will only match if the entire string - from start to end - is of the form you're looking for. Since the bits you're lookinf for don't make up the entire string, they won't match.
Try without those and see if you get any improvement.
Additional: the regexp will only work if the entire paragraph from <p to /p> is on a single line with no newline characters, because . doesn't match a newline character unless you ask for it with the 's' modifier. But then you'll get a new problem with the regexp starting its match way too soon (it always tries to match as soon as it can - in this case, the very first <p it sees).
/<p((?!\/p>).)*!supportEmptyParas.*?\/p>/is
Takes care of this by making sure that the bit it matches between <p and !supportEmptyParas does not contain /p> - which would presumably always appear somewhere between one <p and the next.