--- /dev/null
+var parse = require('ret');
+var types = parse.types;
+
+module.exports = function (re, opts) {
+ if (!opts) opts = {};
+ var replimit = opts.limit === undefined ? 25 : opts.limit;
+
+ if (isRegExp(re)) re = re.source;
+ else if (typeof re !== 'string') re = String(re);
+
+ try { re = parse(re) }
+ catch (err) { return false }
+
+ var reps = 0;
+ return (function walk (node, starHeight) {
+ if (node.type === types.REPETITION) {
+ starHeight ++;
+ reps ++;
+ if (starHeight > 1) return false;
+ if (reps > replimit) return false;
+ }
+
+ if (node.options) {
+ for (var i = 0, len = node.options.length; i < len; i++) {
+ var ok = walk({ stack: node.options[i] }, starHeight);
+ if (!ok) return false;
+ }
+ }
+ var stack = node.stack || (node.value && node.value.stack);
+ if (!stack) return true;
+
+ for (var i = 0; i < stack.length; i++) {
+ var ok = walk(stack[i], starHeight);
+ if (!ok) return false;
+ }
+
+ return true;
+ })(re, 0);
+};
+
+function isRegExp (x) {
+ return {}.toString.call(x) === '[object RegExp]';
+}