with optional capture group empty message is nil, not zero-length string