'use strict';

var has = require('has'); var regexExec = RegExp.prototype.exec; var gOPD = Object.getOwnPropertyDescriptor;

var tryRegexExecCall = function tryRegexExec(value) {

try {
        var lastIndex = value.lastIndex;
        value.lastIndex = 0;

        regexExec.call(value);
        return true;
} catch (e) {
        return false;
} finally {
        value.lastIndex = lastIndex;
}

}; var toStr = Object.prototype.toString; var regexClass = '[object RegExp]'; var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';

module.exports = function isRegex(value) {

if (!value || typeof value !== 'object') {
        return false;
}
if (!hasToStringTag) {
        return toStr.call(value) === regexClass;
}

var descriptor = gOPD(value, 'lastIndex');
var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
if (!hasLastIndexDataProperty) {
        return false;
}

return tryRegexExecCall(value);

};