将用户inputstring转换为正则expression式

我正在用HTML和JavaScriptdevise一个正则expression式testing器。 用户将input一个正则expression式,一个string,并通过单选buttonselect他们想要testing的函数(例如search,匹配,replace等),当该函数运行指定的参数时,程序将显示结果。 自然会有额外的文本框来替代额外的参数等。

我的问题是从用户获取string,并将其转换为正则expression式。 如果我说他们不需要在他们input的正则expression式的周围,那么他们就不能设置标志,比如gi 。 所以他们必须有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);