杂记 › 技术笔记 › 13 位连写只截出 11 位:text-extract 七个内置类型的正则边界实测

13 位连写只截出 11 位:text-extract 七个内置类型的正则边界实测

text-extract七个内置类型逐档实测:手机号档无边界断言,13位连写只截11位;URL档认协议头不认裸域名,右括号尾巴会被吞进结果;IPv4的越界段与前导零一律不命中;数字档把千分位拆成两行。

贴进去的号码,怎么少了两位

13 位连写的 1381234567890 贴进去,结果框只出 1 条 11 位的 13812345678;换成 21 位连写也还是 1 条。少掉的那几位不报错、不提示。

这是 文本信息提取 的默认档。模板实测 6033 字节、149 行,RULES 里 7 个类型的正则原文长度分别 11、46、25、83、75、15、9 字符,flags 七条全是 g,只有 IP 档那 83 字符的一条带边界断言。逐档实测见下表。

类型原文字符数实测能命中实测 0 命中
手机号11联系电话13812345678请查收138-0013-8000
邮箱46a..b@example.comtest@example.c
URL链接25http://localhost:8080/appftp://example.com/file
IP地址83255.255.255.255192.168.001.1
身份证号7518 个字符的一串17 个字符的一串
数字153.14 与 -3.14全角的 123
英文单词9hello world 出 2 项纯中文一行 0 项

手机号档:够 11 位就收,不看它从哪来

联系电话13812345678请查收 里号码紧挨中文、前后没分隔符,照样命中 1 条;反过来,首屏那份 18 位串的中段就截出过 19900101123,+8613800138000 命中的是后 11 位、前缀留在结果外。断链的是分隔符——138-0013-8000 与 138 0013 8000 都 0 命中,11 个全角数字也 0 命中。

无边界断言:够 11 位就收,余下不成第二条 13 位连写 命中 11 位,落 2 位 21 位连写 也只出 1 条 带分隔符 0 命中 绿色段是命中的 11 位

图 1:手机号档三类输入的实测口径

邮箱档:比写法本身宽,也比它严

46 字符的这条接受加号别名、百分号、连续两点和整串大写,a..b@example.com 与 u@-example.com 都整串命中。严在末尾:后缀段的量词是 {2,},所以 test@example 与单字母后缀的 test@example.c 都是 0 命中。

URL 档:协议头是硬门槛,尾巴看运气

25 字符的这条把协议头写死,example.com、www.example.com、ftp://example.com/file 全部 0 命中,端口和查询串反倒不设限。排除字符类里:全角右括号 U+FF09 在同一条类里写了 2 遍,半角括号与半角分号却都不在类里——所以 (https://example.com/y) 提出来的,是带一条右括号尾巴的 https://example.com/y)。

IP 档:七条里唯一带边界断言的一条

83 字符的这条同时管两头。0.0.0.0、255.255.255.255、192.168.1.1 各 1 命中;越界段不给面子,999.1.1.1 与 256.1.1.1 全 0 命中,三段的 1.2.3 也一样;任何一段带前导零就整串不中,01.2.3.4 与 192.168.001.1 都拿不到部分结果。它还被前一个字符卡住:ID12192.168.1.1 里那串合法地址因断言起不了锚,同样 0 命中。

数字档:千分位当分隔符,连字符当负号

15 字符的这条不做数值化,007 和 30 位的长串都逐字符保留。可它把逗号读成分隔符:1,234.50 端出 2 行 ["1","234.50"],一个金额拆成两行;2026-11-05 更热闹,端出 3 行 ["2026","-11","-05"],连字符全被当负号,凭空多出两个不存在的负数。

「英文单词」档:切的是连续字母串,不是词

9 字符的这条抓的是连续 ASCII 字母串。https://www.example.com/path 端出 5 项,含协议名和 com;café naïve 被切成 3 段碎片;纯中文一行 0 项。它叠上去重还有条吞词路径:那行 60 字符的原型链方法名,关去重 6 项、开去重只剩 2 项,toString、valueOf、hasOwnProperty、constructor 这 4 个词被当已见过吞掉。

50 行一起贴:行数恒等于命中数

50 行、1487 字符的混合样本一次贴入,七类合计命中 265 项、开去重后 160 项(减 105);单档看 number 从 93 项到 64 项、word 从 133 项到 67 项、url 是 11 项到 11 项(那 11 条互不相同,不是没生效)。输出行数恒等于命中数,实测结果值不以换行结尾,空行与无命中行只贡献 0 行;去重保的是首次出现的位置,不做字典序排序。耗时只测了 Node 侧同步调用:phone 档这份样本连打 200 次累计 8.5 毫秒、平均 0.0427 毫秒每次;把 2 万个号码连写成 220000 字符的单行,出 20000 项用了 1.9 毫秒。这两个值都不含浏览器解析与重绘,浏览器端耗时这轮没测。

同一份 50 行样本:深色关去重,浅色开去重 phone 10 到 5 email 8 到 7 url 11 到 11 ip 10 到 6 number 93 到 64 word 133 到 67

图 2:六档在同一份样本上的去重前后条数

它不报错,也不告诉你少了什么

页面没有「未找到」一类提示串。零命中但输入非空时,统计照常写「匹配数量:0」,文本总长仍是输入本身的长度,切 7 个档它 7 次都不变;输入去掉空白后为空时,结果框、高亮区、统计区三个出口一次性清空,连「匹配数量:0」那行也没了,只剩模板写的占位串「提取结果...」。身份证号只登记两件事:它在类型清单里排第 5,命中串恒为 18 个字符,内容层面的任何判断这轮没测。

高亮和提取不是同一次匹配

HTTP://EXAMPLE.COM/PATH 在 URL 档提取 0 项、统计也写 0,可同一份输入开了高亮,实测有 1 个区间把这 23 字符整串包住:结果框是空的,两处匹配走的是不同口径。本页七条都只在页内跑这一次,不涉及把自己代码里的一条写法反复复用那种情形——那种情形旧文 正则的标志位与状态 写过。

FAQ

Q:一行里两个号码,为什么只出一行?

看是不是连写:两个不同号连成 22 位会切成 11 加 11;13 位或 21 位只出 1 条,取走 11 位后剩下的凑不出下一条,也不回看重叠区。

Q:结果比原文短,是不是吞了字符?

不一定。邮箱要后缀至少 2 个字母,缺后缀和单字母后缀都不命中;URL 没有协议头直接 0 项;数字档是把千分位金额拆成 2 行,不是吞掉。

Q:勾上去重为什么条数掉这么多?

50 行样本七类从 265 项到 160 项,光 word 一档就占 66;去重只管结果列表,输出 2 行时高亮区仍可以是 3 个区间。重复怎么按业务口径收,可看 批量提取信息 那篇的记录。

📎 相关文章

120 个词槽、15 条整句、1 句写死的开头:lorem-ipsum 的词表清点与重复片段实测 2026-11-05 SVG 预览的尺寸听谁的:显示框恒等于容器,删掉 viewBox 后 r=1 实测 2 像素 2026-11-05 文本分列后空字段没丢:a,,b 照留、列号越界填空、填 0 或 abc 退回全部列实测 2026-11-05 1 GB 文件由 1024 块拼成:任意大小文件生成的分块节奏、取消边界与三种填充字节 2026-11-04 文件名提取的三处边界:结尾斜杠只兜一格、查询串整块留下、空行静默消失 2026-11-04