正则生成
按常见场景拼出正则,首行直接给式子,逐段解释与正反样本折进详情里。
这一页不是自然语言转正则的模型,而是一张场景表加一个组合器。它把描述文本与每个场景的关键词表做匹配(最长关键词优先,所以「中国手机号」不会被「手机」抢走),命中后取该场景内置的两条模式:整段版 ^(?:…)$ 用于判属性,提取版不带外层锚定且至少一个捕获组,用于从长文本里取值。也就是说它做的是拼装:把已经写好的分支片段组合成完整表达式,并把每个片段逐段解释给你看。每个场景带正例、反例、可选的「本式会放过但不合法」样本与注意事项,测试用例逐条拿真机 RegExp 跑过。描述落不到场景表里时不编造结果,而是回吐支持场景清单;页面同样不发网络请求,描述与样本都只在浏览器里处理。
每条结果的第一行就是那条能直接抄走的正则本体,页面上没有一键复制按钮(选中即可抄)。有些边界是明写的:IPv6 是简版,形状判定加至多一个 :: ,不校验两侧组数之和是否超过 8(因此 1:2:3:4:5:6:7::8:9:10 会被放过),不支持 zone id、内嵌 IPv4 与 CIDR;日期只做形状判定,2026-02-30 会被放过,日历合法性是有限状态自动机的事;UUID 的 variant 位要求 8/9/A/B(大小写均可)即 RFC 4122 的 10xx 变体,version 位允许 1–8。明确不做的话题单独列在拒绝表里,共五条:邮政编码、居民身份证号、银行卡号与信用卡号、手机号归属地与运营商、统一社会信用代码。
正则生成怎么用
- 写描述或直接写场景名:输入「中国手机号」「强密码规则」「Markdown 标题提取」「semver」都会命中对应场景;一行一条描述可以批量取多条,每条一张卡、未识别的行单独成一张写清楚为什么没生成,顶部读数给「N 条描述 · 命中 N · 未识别 N」。一批最多 40 行,超了整批不判定,也不会有半批结果留在页面上。
- 整段式与提取式:工具条上「整段匹配 / 提取片段」是两颗按钮,切过去会重建式子本体(^(?:…)$ 的锚定版 ↔ 不带外层锚定、带捕获组的宽松版),不是只改一行说明;提取版另附一段 matchAll 用法片段,并提醒 matchAll 要求正则带 g 标志,否则会抛 TypeError。
- 看逐段解释与样本实测:明细都折在结果卡下面的 <details> 里,标题写着内容与条数:逐段解释(N 段)、样本实测(3 个正例、2 个反例,用本机浏览器正则真跑过)、本式会放过但不合法(已知过度接受点)、用法与注意事项(1 段用法片段 + N 条注意事项)。这些块收起时不渲染,页内 Ctrl+F 搜不到,要先展开;改参数重算后原先展开着的那几块会保持展开。「逐段解释」开关关掉时那张表整块不进 DOM,提示条同时写明它已关闭;「附 Java/Python 写法」这颗开关关掉时那一整块同样不进 DOM,不是藏起来。
- 内置的 20 个场景与目录分组:内置 20 个场景:大陆手机号、大陆固话、邮箱、URL、IPv4、IPv6、MAC 地址、UUID、日期、时间、日期时间、中文文本、全角字符、半角字符、强密码、重复单词、Markdown 标题、HTML 标签、千分位小数、semver 版本号。描述留空时页面给的是支持目录,它按 7 组折叠:电话号码 2、网络地址 4、标识与邮箱 3、时间 3、字符与字宽 4、标记与数值 3、口令 1,加起来正好那 20 个场景;上面那颗过滤输入框只改已经渲染出来的那些行的显隐,不参与识别命中,另配「展开全部分组」和「收起全部分组」两颗按钮。
- 结果卡上那几行读数:版面按「先给式子」排:每条结果的第一行就是那条能直接抄走的正则本体,独占一行、自动折行;紧随的一行读数写 flags、捕获组个数和「样本 5 条(3 正 2 反)· 全部符合预期」,再一行写识别依据——一句话同时命中多个场景时这里会把候选全列出来。逐段解释、样本实测、会放过但不合法的清单、用法与注意事项各占一个原生 <details>,默认收起,标题里带条数。
常见问题
为什么邮政编码这种常见需求被砍掉
中国的 6 位邮编按 \d{6} 就够,但这一条同时会放过任何 6 位数字(电话、日期、随机 ID),实际筛不出东西;而「各国邮编」要处理的是一堆彼此矛盾的规则:英国是字母数字混合的 A9 9A9A9A 结构、美国是 ZIP-5 与 ZIP+4、加拿大严格交替的 A9A 9A9 且禁用若干易混字母。把这些塞进一条正则要么过松、要么变成没法维护的分支树。页面宁可列出拒绝理由,并把「按国家分别写、拿真实样本回归」写进替代做法。
生成的「强密码」正则能说明密码安全吗
不能,这是页面里写得最直白的一条注意事项。长度与字符类别的计数只能证明这个串满足某条策略的形状,跟抗猜度、跟它有没有出现在泄露密码库里是两件事,衡量强度的应当是熵与字典检查。另外策略层面有个反面教材值得记住:禁止字符(「不许用符号」「必须包含某特殊字符」)会把用户推向 1qaz2wsx 这类绕规则的形状,实际降低可用性也降低强度。本场景生成的是「长度 8–64、至少含大小写、数字、符号中的若干类、不含空白」这类可枚举的类别要求,不是密码学意义上的强度判定。
Java 与 Python 的写法差异具体在哪
开方言后 Java 给出 Pattern.compile("…"),里面每个反斜杠都写成两个,因为 Java 源码字符串本身要先转义一次;Python 给出 re.compile 加 r 前缀的形式,raw string 前缀让反斜杠原样进正则,锚点 ^ $ 也保留。Python 的 \A 与 ^ 在多行标志下不等价。方法名层面:Java 的 matches() 要求整串匹配、find() 才是不锚定的搜索,Python 的 fullmatch() 对应整串、search() 对应不锚定,而 match() 只从串首开始。命名组 Java 是 (?<name>…)、Python 是 (?P<name>…); lastIndex 的推进方式在 JavaScript 里靠 g 标志与 exec 循环,Java 的 Matcher 需要自己重置;\p{Script=Han} 这类 Unicode 属性类在 Java 直接可用,JavaScript 需要 u 标志并且 Safari 16.4 以下不支持。这些内容在每条结果末尾那块「其它语言的写法(Java / Python)」折叠里,收起时不渲染,要展开才看得到。
拒绝表里那五条分别是因为什么
邮政编码:各国规则差异过大,一条正则要么过松要么长得没法维护。居民身份证号:校验位算法与格式之外还涉及行政区划码,正则解决不了「是不是本人号码」。银行卡号与信用卡号:这类校验请用本页旁边的 checksum 工具,Luhn 有明确定义,不该被一条正则冒充。手机号归属地与运营商:需要外部号段库,纯文本无法判定。统一社会信用代码:GB 32100 的加权校验位用正则表达会退化成 18 个任意字符。