代码之家  ›  专栏  ›  技术社区  ›  rustyshackleford

将作为字符串从API返回的正则表达式转换为JavaScript中的有效正则表达式对象

  •  1
  • rustyshackleford  · 技术社区  · 6 年前

    我从外部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/

    我的问题是。。。为什么会发生这种情况,我该如何避免?我想把字符串文字用作正则表达式。

    提前谢谢。

    2 回复  |  直到 6 年前
        1
  •  2
  •   CertainPerformance    6 年前

    这个 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(/\/(.*)\/([a-z]*)/);
    const regex = new RegExp(pattern, flags);
    console.log(regex);
        2
  •  2
  •   Jack Bashford    6 年前

    去掉斜线和旗帜,然后重建:

    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);