[英]Turning a regex returned as a string from an API into a valid RegEx object in JavaScript
我正在从外部API提取正则表达式,它以字符串形式返回。 我想使用正则表达式进行地址验证,但是在字符串上调用new RegExp()
之后,似乎无法正确转义不需要的字符。
这是我要使用的正则表达式:
console.log(regexFromAPI);
输出量
/((\\W|^)box\\s+(#\\s*)?\\d+|post\\s+office|(\\W|^)p\\.?\\s*o\\.?\\s+(#\\s*)?\\d+)/i
但是,我不能使用它-我需要它首先成为正则表达式。
如果我这样做,例如:
const pattern = new RegExp(regexFromAPI);
接着:
console.log(pattern);
我得到以下内容:
输出量
//((W|^)boxs+(#s*)?d+|posts+office|(W|^)p.?s*o.?s+(#s*)?d+)/i/
我的问题是……为什么会发生这种情况,我该如何避免呢? 我想将我的字符串文字用作正则表达式。
提前致谢。
RegExp
构造函数不希望带有/
分隔符的字符串,也不能期望带有超出最终/
选项的字符串。 如果你这样做,从调用生成模式new RegExp
它会导致一个匹配与文字斜杠开头的字符串/
,并以正斜杠结束/
后面的标志字符(在这里, i
)。
相反,您应该传递不带 /
分隔符的模式字符串,并将标志作为第二个参数传递-您可以使用另一个正则表达式轻松提取这些标志:
const fullPatternStr = String.raw`/((\\W|^)box\\s+(#\\s*)?\\d+|post\\s+office|(\\W|^)p\\.?\\s*o\\.?\\s+(#\\s*)?\\d+)/i`; const [, pattern, flags] = fullPatternStr.match(/\\/(.*)\\/([az]*)/); const regex = new RegExp(pattern, flags); console.log(regex);
脱下斜杠和标记,然后对其进行重构:
const str = String.raw`/((\\W|^)box\\s+(#\\s*)?\\d+|post\\s+office|(\\W|^)p\\.?\\s*o\\.?\\s+(#\\s*)?\\d+)/i`; let regexBody = str.slice(1, str.lastIndexOf("/")); let flags = str.split("/")[str.split("/").length - 1]; let regex = new RegExp(regexBody, flags); console.log(regex);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.