¥
立即购买

JavaScript正则表达式生成器

5 浏览
1 试用
0 购买
Dec 8, 2025更新

本提示词专为JavaScript开发场景设计,能够根据用户提供的模式描述生成精确、高效的正则表达式解决方案。提示词采用专业开发者角色设定,确保生成的代码符合JavaScript最佳实践,同时提供详细的代码解释和使用示例。适用于表单验证、文本匹配、数据提取等多种Web开发场景,帮助开发者快速解决正则表达式编写难题。

正则表达式代码

// 推荐:先对输入做 trim,再整串匹配
const USERNAME_RE = /^(?!.*__)[A-Za-z][A-Za-z0-9_]{1,14}[A-Za-z0-9]$/;

function isValidUsername(input) {
  const value = String(input).trim(); // 忽略首尾空格
  return USERNAME_RE.test(value);
}

// 可选(一次性容忍首尾空格):直接在正则中处理首尾空白
// const USERNAME_RE_WITH_SPACES = /^\s*(?!.*__)[A-Za-z][A-Za-z0-9_]{1,14}[A-Za-z0-9]\s*$/;
// 使用方式与上面类似

代码解释

  • 整体目标:整串匹配一个用户名(去掉首尾空格后),满足以下条件:
    • 以字母开头
    • 只包含字母、数字、下划线
    • 总长度 3–16
    • 不允许出现连续两个下划线“__”
    • 不能以下划线结尾

正则分解(以 USERNAME_RE 为例):

  • ^ 和 $:整串匹配的锚点,确保整个字符串完全匹配。
  • (?!.*__):负向前瞻,禁止任何位置出现两个连续下划线。
    • 说明:从字符串开头断言“后续任意位置不出现‘__’”,一旦出现则整体不匹配。
  • [A-Za-z]:第一个字符必须是英文字母(大小写均可)。
  • [A-Za-z0-9_]{1,14}:中间主体,允许字母、数字或下划线,长度 1–14。
    • 加上首字符和末尾字符合计长度:1 + [1..14] + 1 = [3..16]。
  • [A-Za-z0-9]:最后一个字符必须是字母或数字(不能是下划线),从而满足“不能以下划线结尾”。

关于忽略首尾空格:

  • 推荐做法是在代码中先执行 trim() 再用 USERNAME_RE 测试,逻辑清晰、可维护性更好。
  • 若希望一次性用正则处理,可使用 USERNAME_RE_WITH_SPACES,在首尾加入 \s* 来吞掉空白,但仍建议业务侧显式 trim。

使用示例

  1. 基础表单验证
console.log(isValidUsername('Alice_01'));      // true
console.log(isValidUsername('  Bob_2  '));     // true(被 trim 后验证)
console.log(isValidUsername('ab'));            // false(长度不足 3)
console.log(isValidUsername('1alex'));         // false(未以字母开头)
console.log(isValidUsername('alex__wu'));      // false(连续下划线)
console.log(isValidUsername('Kevin_'));        // false(以下划线结尾)
console.log(isValidUsername('abcdefghijklmnop')); // true(16 个字母)
console.log(isValidUsername('abcdefghijklmnopq')); // false(17 个字符超长)
  1. 表单提交前的前端校验
const inputEl = document.querySelector('#username');
const errorEl = document.querySelector('#username-error');

inputEl.addEventListener('input', () => {
  if (isValidUsername(inputEl.value)) {
    errorEl.textContent = '';
  } else {
    errorEl.textContent = '用户名需以字母开头,长度3-16,允许字母/数字/下划线,且不能有连续下划线或以下划线结尾。';
  }
});
  1. 批量数据清洗(去除空白并过滤非法用户名)
const rawList = [' Alice_01 ', 'ab', '1alex', 'ab__cd', 'JackMa', 'Jerry_'];
const cleanList = rawList.map(s => s.trim()).filter(s => USERNAME_RE.test(s));
console.log(cleanList); // ['Alice_01', 'JackMa']

注意事项

  • 仅限 ASCII 字母、数字和下划线:
    • 若需支持多语言字母(如中文、带重音字符等),可使用 Unicode 属性类(需加 u 标志):
      • 开头字母:[\p{L}]
      • 内容字符:[\p{L}\p{N}_]
      • 末尾字符:[\p{L}\p{N}]
      • 示例:/^(?!.*__)[\p{L}][\p{L}\p{N}_]{1,14}[\p{L}\p{N}]$/u
  • 建议对输入先做 trim,以避免被动在正则中处理空白,提升可读性。
  • 负向前瞻 (?!.*) 会对整串搜索“”,但用户名最大 16 字符,性能不是瓶颈。
  • 若后续需要允许连字符等其它符号,请同步更新:
    • 字符集(中间与结尾);
    • 结尾限制(确保不以特殊符号结束);
    • 连续符号限制(新增相应的负向前瞻)。

正则表达式代码

// Global extractor: captures full order id, date, and sequence in groups 1–3
const ORDER_ID_RE = /(?:(?<=\[)|(?<=")|(?<=')|(?<![\w-]))(ORD-(\d{8})-(\d{6}))(?:(?=\])|(?=")|(?=')|(?![\w-]))/g;

// Example extractor function
function extractOrders(text) {
  const results = [];
  for (const m of text.matchAll(ORDER_ID_RE)) {
    // m[1] = full order id, m[2] = date (YYYYMMDD), m[3] = sequence (6 digits)
    results.push({
      id: m[1],
      date: m[2],
      seq: m[3],
      index: m.index, // start index of the match (the order id itself)
    });
  }
  return results;
}

代码解释

  • Pattern: (?:(?<=\[)|(?<=")|(?<=')|(?<![\w-]))(ORD-(\d{8})-(\d{6}))(?:(?=\])|(?=")|(?=')|(?![\w-]))
  • Modifiers:
    • g (global): find all matches in the text.

Breakdown:

  • Left boundary assertion (?:(?<=\[)|(?<=")|(?<=')|(?<![\w-]))
    • (?<=\[)|(?<=")|(?<='): If the ID is wrapped, assert it is immediately preceded by [, " or '.
    • (?<![\w-]): Otherwise, ensure the ID is not glued to a word character or a hyphen on its left. This avoids partial matches inside longer tokens.
  • Main capture (ORD-(\d{8})-(\d{6}))
    • Group 1: ORD-YYYYMMDD-XXXXXX (the full order number).
    • Group 2: \d{8} (the date, 8 digits, no leap-year validation by design).
    • Group 3: \d{6} (the 6-digit sequence).
  • Right boundary assertion (?:(?=\])|(?=")|(?=')|(?![\w-]))
    • (?=\])|(?=")|(?='): If wrapped, assert the matching closing ], " or ' immediately follows.
    • (?![\w-]): Otherwise, ensure the right neighbor is not a word character or hyphen.

Notes on wrapper handling:

  • The ID may appear unwrapped, or wrapped by square brackets [...], single quotes '...', or double quotes "...".
  • The wrapper characters are not part of the match due to lookarounds, so Group 1 contains only the ID.
  • The lookarounds are fixed-width and efficient, and they keep capturing groups clean: only 3 groups, exactly as required.

使用示例

  1. Basic extraction from a mixed log:
const log = `
INFO created: ORD-20250101-000123
DEBUG payload: "ORD-20240229-123456" processed
WARN missing id 'ORD-20231231-654321'
OK list: [ORD-20240315-000001] and also ORD-20250101-888888 end
`;

const matches = extractOrders(log);
console.log(matches);
/*
[
  { id: 'ORD-20250101-000123', date: '20250101', seq: '000123', index: 15 },
  { id: 'ORD-20240229-123456', date: '20240229', seq: '123456', index: 39 },
  { id: 'ORD-20231231-654321', date: '20231231', seq: '654321', index: 83 },
  { id: 'ORD-20240315-000001', date: '20240315', seq: '000001', index: 117 },
  { id: 'ORD-20250101-888888', date: '20250101', seq: '888888', index: 153 }
]
*/
  1. Extract and normalize into a simple array of IDs:
const ids = Array.from(log.matchAll(ORDER_ID_RE), m => m[1]);
console.log(ids);
// ['ORD-20250101-000123', 'ORD-20240229-123456', 'ORD-20231231-654321', 'ORD-20240315-000001', 'ORD-20250101-888888']
  1. Post-filtering by date prefix (e.g., only 2025 orders):
const only2025 = [];
for (const m of log.matchAll(ORDER_ID_RE)) {
  if (m[2].startsWith('2025')) only2025.push({ id: m[1], date: m[2], seq: m[3] });
}
console.log(only2025);
// [{ id: 'ORD-20250101-000123', date: '20250101', seq: '000123' }, { id: 'ORD-20250101-888888', date: '20250101', seq: '888888' }]

注意事项

  • Lookbehind support: The pattern uses fixed-width lookbehinds (?<=/?<!). Most modern engines (Node.js 10+, recent Chrome/Edge/Firefox/Safari) support them. If you must support environments without lookbehind, use a two-pass approach:
    1. Find core IDs with /ORD-(\d{8})-(\d{6})/g,
    2. Then inspect the character before and after the match to accept plain, [...], '...', or "..." contexts.
  • Wrapper symmetry: This extractor ensures the ID is properly adjacent to a closing ], ' or ", or separated from word/hyphen characters. It does not strictly enforce that the opening and closing wrappers are the same character in a single, indivisible branch. In typical logs with well-formed wrappers this is sufficient for extraction. If strict pairing is required, consider a two-pass validation (as described above) or a parser that checks both sides explicitly.
  • Date validity: The date part is 8 digits as requested; it does not validate month/day ranges or leap years. If you need stricter date validation, apply an additional check after extraction.
  • Case sensitivity: The regex expects uppercase ORD-. If your logs may contain lowercase or mixed-case, add the i flag and optionally verify the prefix in code.

正则表达式代码

// 路径:/users/:id/photos/:photoId?
// 要求:id 与 photoId 为数字;photoId 可选;可忽略末尾斜杠;整串匹配;依次捕获 id 与 photoId

// 推荐:使用位置捕获,确保依次捕获 id(第1组)与 photoId(第2组)
const routeRe = /^\/users\/(\d+)\/photos(?:\/(\d+))?\/?$/;

// 可选(增强可读性,同时仍保持捕获顺序 1:id, 2:photoId)
// const routeRe = /^\/users\/(?<id>\d+)\/photos(?:\/(?<photoId>\d+))?\/?$/;

function parsePath(path) {
  const match = routeRe.exec(path);
  if (!match) return null;

  // 依次捕获:match[1] 为 id,match[2] 为 photoId(可能为 undefined)
  const id = parseInt(match[1], 10);
  const photoId = match[2] !== undefined ? parseInt(match[2], 10) : null;

  return { id, photoId };
}

// 简单测试
console.log(parsePath('/users/123/photos/456')); // { id: 123, photoId: 456 }
console.log(parsePath('/users/123/photos'));     // { id: 123, photoId: null }
console.log(parsePath('/users/123/photos/456/'));// { id: 123, photoId: 456 }
console.log(parsePath('/users/123/photos/'));    // { id: 123, photoId: null }
console.log(parsePath('/users/abc/photos'));     // null

代码解释

  • ^ 与 $:锚定字符串开始与结束,确保整串匹配(避免前后有多余字符)。
  • /users/:匹配固定路径前缀 /users/。
  • (\d+):
    • 第1个捕获组,匹配 id,仅允许数字(1 位或更多)。
  • /photos:匹配固定路径片段 /photos。
  • (?:/(\d+))?:
    • 非捕获分组 (?:...):仅用于结构化与可选性,不生成捕获组。
    • 其中的 /(\d+) 为第2个捕获组,匹配 /photoId(仅数字)。
    • 整体加 ? 表示 photoId 这一段是可选的。
  • /?:末尾可选斜杠,满足“忽略末尾斜杠”的要求。
  • 修饰符:无(不使用 g/i,因为需整串、区分大小写的路径匹配)。

匹配逻辑:

  • 路径必须以 /users/<数字>/photos 开始。
  • 可继续匹配 /<数字> 作为 photoId(可省略)。
  • 路径可有也可没有末尾斜杠。
  • 成功匹配时依次捕获:
    • 组1:id
    • 组2:photoId(可能为 undefined)

使用示例

  • 场景1:路由中间件参数解析

    const path = '/users/987/photos/321';
    const m = routeRe.exec(path);
    if (m) {
      const id = Number(m[1]);
      const photoId = m[2] ? Number(m[2]) : null;
      // 继续执行业务逻辑
    }
    
  • 场景2:统一解析函数(用于服务端或前端路由)

    function matchUserPhotoPath(path) {
      const m = routeRe.exec(path);
      if (!m) return null;
      return { id: Number(m[1]), photoId: m[2] ? Number(m[2]) : null };
    }
    
    console.log(matchUserPhotoPath('/users/42/photos'));      // { id: 42, photoId: null }
    console.log(matchUserPhotoPath('/users/42/photos/99/'));  // { id: 42, photoId: 99 }
    
  • 场景3:批量校验与提取

    const paths = ['/users/1/photos', '/users/2/photos/3', '/users/abc/photos'];
    const results = paths.map(p => {
      const m = routeRe.exec(p);
      return m ? { ok: true, id: +m[1], photoId: m[2] ? +m[2] : null } : { ok: false };
    });
    console.log(results);
    // [{ok:true,id:1,photoId:null},{ok:true,id:2,photoId:3},{ok:false}]
    

注意事项

  • 本正则只匹配纯路径,不包含查询字符串或哈希。例如若可能出现 /users/1/photos?x=1,请在匹配前先剥离查询/哈希部分,或扩展正则。
  • 数字格式:
    • 允许前导零(如 /users/001/photos/0002)。如需禁止或限制位数,可将 \d+ 改为更严格的模式(例如 [1-9]\d* 限制不以 0 开头;或 \d{1,9} 限制长度)。
  • 路径大小写敏感:/Users/ 与 /users/ 不等同。如需大小写不敏感,可在构造正则时添加 i 修饰符,但一般路由建议区分大小写。
  • 性能与安全:
    • 正则已通过 ^ 与 $ 锚定,结构线性、无灾难性回溯风险,适合在线请求实时匹配。
  • 若需可读性更高的命名捕获(现代环境支持),可使用命名组版本并通过 match.groups.id 与 match.groups.photoId 访问;但位置捕获依旧按顺序返回,满足“依次捕获 id 与 photoId”的要求。

示例详情

解决的问题

用一条指令,快速产出“可直接上手”的正则方案,帮助前端/全栈在表单校验、文本提取、URL解析、日志处理与数据清洗等场景中,精准匹配、稳定上线。通过专业角色扮演与结构化输出,给到清晰的正则写法、运行示例与注意事项,减少试错与返工,显著缩短开发到交付的时间。

  • 让不会写/不敢改正则的同学,秒变“懂行的专家”
  • 让老手也能更快收敛方案、覆盖边界、避免性能隐患
  • 统一团队风格与质量,沉淀可复用的正则资产,推动标准化与协作
  • 降低线上故障与数据误判风险,减少灰度和回滚成本
  • 支持按业务描述生成,高准确度匹配,配套示例一键验证 适合:前端/全栈/测试/数据工程团队,用于高频的输入校验、内容抽取、安全过滤与数据预处理,先试用验证价值,再平滑升级为团队标准工具。

适用用户

前端开发工程师

快速产出生/改/测表单校验规则,如注册登录、地址、支付信息;复制示例即用,减少线上因校验不严导致的问题。

全栈与小团队负责人

统一团队校验口径,沉淀可复用模板;根据业务变化一键调整规则并分发,提高迭代速度与交付一致性。

测试与QA工程师

自动生成命中与未命中样例,覆盖边界与异常输入;快速构造用例验证需求,提升缺陷发现率。

特征总结

根据自然语言描述,精准生成可复用正则,表单校验一键落地,减少手写出错
自动给出完整JS用法与注释说明,复制即用,团队统一规范,降低沟通成本
内置常见场景模板:邮箱、手机号、URL、身份证,一键定制扩展
自动优化边界与性能,避免回溯陷阱,确保线上稳定与速度表现不拖慢加载
生成测试用例与输入示例,快速验证匹配效果,及时发现边界问题与误判风险
支持多语言讲解与注释,便于培训新人,上手即懂,减少试错成本与时间
可按业务规则定制参数与白名单黑名单,灵活适配不同项目与渠道需求
内含注意事项与常见坑提示,提前规避安全与合规问题,降低上线风险与维护成本
从描述到代码全流程一站式产出,替你把复杂语法拆解清楚,学习与产出同步
可导出团队共享模板,沉淀可复用资产,提升多人协作效率与交付一致性

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 635 tokens
- 3 个可调节参数
{ 模式描述 } { 匹配场景 } { 输出语言 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

半价获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59