将用户inputstring转换为正则expression式
我正在用HTML和JavaScriptdevise一个正则expression式testing器。 用户将input一个正则expression式,一个string,并通过单选buttonselect他们想要testing的函数(例如search,匹配,replace等),当该函数运行指定的参数时,程序将显示结果。 自然会有额外的文本框来替代额外的参数等。
我的问题是从用户获取string,并将其转换为正则expression式。 如果我说他们不需要在他们input的正则expression式的周围,那么他们就不能设置标志,比如g
和i
。 所以他们必须有expression式的周围,但我怎么能将该string转换为正则expression式? 它不能是一个string,因为它是一个string,我不能将它传递给RegExp构造函数,因为它不是没有//
的string。 有没有其他的方法来使一个用户inputstring成正则expression式? 我将不得不parsing正则expression式的string和标志,然后构造它的另一种方式吗? 我应该让他们input一个string,然后分别input标志?
使用RegExp对象构造函数从string创build正则expression式:
var re = new RegExp("a|b", "i"); // same as var re = /a|b/i;
var flags = inputstring.replace(/.*\/([gimy]*)$/, '$1'); var pattern = inputstring.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1'); var regex = new RegExp(pattern, flags);
要么
var match = inputstring.match(new RegExp('^/(.*?)/([gimy]*)$')); // sanity check here var regex = new RegExp(match[1], match[2]);
使用JavaScript RegExp对象构造函数 。
var re = new RegExp("\\w+"); re.test("hello");
您可以将标志作为第二个stringparameter passing给构造函数。 详细信息请参阅文档。
在我的情况下,用户input的事件被分隔符包围,有时候不是。 因此我又增加了一个案例。
var regParts = inputstring.match(/^\/(.*?)\/([gim]*)$/); if (regParts) { // the parsed pattern had delimiters and modifiers. handle them. var regexp = new RegExp(regParts[1], regParts[2]); } else { // we got pattern string without delimiters var regexp = new RegExp(inputstring); }
这里是一个单行: str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
我从escape-string-regexp NPM模块中得到它。
尝试一下:
escapeStringRegExp.matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; function escapeStringRegExp(str) { return str.replace(escapeStringRegExp.matchOperatorsRe, '\\$&'); } console.log(new RegExp(escapeStringRegExp('example.com'))); // => /example\.com/
我build议你也添加单独的checkbox或特殊标志的文本框。 这样,显然用户不需要添加任何//
。 在replace的情况下,提供两个文本框。 这会让你的生活变得更轻松。
为什么? 因为否则有些用户会添加//
而其他用户则不会。 有些会造成语法错误。 然后,在你去掉//
之后,你可能会得到一个语法上有效的正则expression式,这个正则expression式不会像用户所期望的那样,导致奇怪的行为(从用户的angular度来看)。
感谢早些时候的答案,这个块充当了一个通用的解决scheme,将一个可configuration的string应用到RegEx中,用于过滤文本:
var permittedChars = '^a-z0-9 _,.?!@+<>'; permittedChars = '[' + permittedChars + ']'; var flags = 'gi'; var strFilterRegEx = new RegExp(permittedChars, flags); log.debug ('strFilterRegEx: ' + strFilterRegEx); strVal = strVal.replace(strFilterRegEx, ''); // this replaces hard code solt: // strVal = strVal.replace(/[^a-z0-9 _,.?!@+]/ig, '');
当string无效或不包含标志等时,这也将工作:
function regExpFromString(q) { let flags = q.replace(/.*\/([gimuy]*)$/, '$1'); if (flags === q) flags = ''; let pattern = (flags ? q.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1') : q); try { return new RegExp(pattern, flags); } catch (e) { return null; } } console.log(regExpFromString('\\bword\\b')); console.log(regExpFromString('\/\\bword\\b\/gi'));
你可以使用checkbox来请求标志,然后做这样的事情:
var userInput = formInput; var flags = ''; if(formGlobalCheckboxChecked) flags += 'g'; if(formCaseICheckboxChecked) flags += 'i'; var reg = new RegExp(userInput, flags);