Yes, it's expected behaviour.
If data is not serialized by ajax (ie. it's already a string in the options like in these examples), it still
has to be encoded (encodeURIComponent), in which case any question mark gets transformed into (%)3F and the regexps never succeed (by default, the request body's content-type is
application/x-www-form-urlencoded, so it's a clear indication that data has to be encoded - let me stress this: encoding data is
not optional).
Setting jsonp to false only hides the real issue here.