function regexMatch(input, text, options = {}) { const { flags = '', group = 0, global = /g/.test(flags) } = options; const regex = input instanceof RegExp ? input : new RegExp(input, flags); const results = []; let match;if (global) {while ((match = regex.exec(text)) !== null) { if (match.length > group) results.push(match[group]); else results.push(null); }} else {match = regex.exec(text); return match && match.length > group ? match[group] : null;}return results;}

写一个通用的正则匹配与提取函数,核心是让调用者能灵活指定模式、目标文本、是否全局匹配、是否忽略大小写,以及想要提取哪一组捕获内容(比如第 0 组全匹配,第 1 组第一个括号内容等)。它不该绑定具体业务逻辑,而应像工具一样“即插即用”。
支持基础匹配与分组提取
函数至少要区分两种常用场景:单纯判断是否匹配(返回布尔),和提取具体内容(返回字符串或数组)。对带捕获组的正则,应允许用户指定提取第几组——默认为 0(全匹配),也可传 1、2 等提取对应括号内的内容。若匹配失败,统一返回 null 或空数组,避免抛错打断流程。
- 使用 RegExp.exec() 而非 String.match(),便于控制单次/多次匹配,并稳定获取 groups
- 对全局正则(g 标志),循环调用 exec 提取所有匹配;非全局时只取第一个结果
- 提取第 n 组时,先检查 exec 结果数组长度是否 ≥ n+1,防止越界访问
统一处理标志与选项
正则标志(如 i、g、m)不应硬编码在函数内部,而应由调用者通过 options 对象传入。常见字段包括:flags(字符串,如 'gi')、group(数字,默认 0)、global(布尔,显式控制是否全局,可覆盖 flags 中的 g)。
- 若用户传了 flags,优先用它构造 RegExp;否则从 options.flags 拼接,再合并默认需要的标志
- 忽略大小写(i)和多行模式(m)按需启用,不默认开启
- 当指定了 group > 0 但正则没定义对应捕获组,返回 null 并可选打印警告(非必须)
兼容字符串与正则对象输入
调用者可能直接传 /abc/g,也可能传字符串 "abc"。函数应自动识别并转换:若输入是 RegExp 实例,直接使用;若是字符串,则根据 options.flags 构造新正则。这样既保持灵活性,又避免重复 new RegExp() 出错。
- 检测输入是否为 RegExp:用 input instanceof RegExp
- 若为字符串且未传 flags,缺省使用 '';若传了 flags,就组合成 new RegExp(pattern, flags)
- 对字符串模式中的特殊字符(如 /、\),不自动转义——交由使用者保证合法性,保持透明性
返回结构清晰、易于链式处理
返回值格式要一致:单次匹配返回单个结果(字符串或 null),全局匹配返回字符串数组(每个元素是提取出的 group 内容)。不返回原始 exec 数组,也不嵌套过深。这样下游代码可以直接 map、filter 或 join。
- 非全局匹配:返回提取后的字符串,无匹配则返回 null
- 全局匹配:返回字符串数组,空数组表示无匹配
- 若 group 为 0 且全局,数组中每个元素是完整匹配字符串;若 group 为 1,则是每个匹配的第一个捕获组











