功能说明
把用户输入直接拼进 RegExp 会让点号、星号和括号变成元字符,既可能匹配错误,也可能引入难以排查的性能问题。该函数在每个元字符前加反斜杠,并提供按字面量构造正则的辅助函数,确保输入只按文本本身匹配。
关键代码
escapeRegExp 使用字符类匹配点、星号、加号、问号、脱字符、美元符、花括号、圆括号、竖线、方括号和反斜杠,并在替换串中使用 $& 保留原字符。literalRegExp 先转义输入,再拒绝会改变 lastIndex 状态或有额外语义的 g、y 标志。
return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
使用注意
转义只保证字面量匹配,不防御超大输入导致的性能问题。flags 仍可能包含 i、m、s、u 等合法标志,非法标志由 RegExp 构造器抛错。不要用该函数处理已经是正则源码的字符串,否则会二次转义。非字符串输入会抛 TypeError。
验证方式
断言 escapeRegExp(“a.b*c”) 返回 a.b*c。new RegExp(escapeRegExp(“1+1”)).test(“1+1”) 为 true,且不会匹配 11。literalRegExp(“a.b”, “i”).test(“A.B”) 为 true。传入 g 或 y 标志应抛 RangeError,传入数字应抛 TypeError。