贴进去的号码,怎么少了两位
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 |
| 邮箱 | 46 | a..b@example.com | test@example.c |
| URL链接 | 25 | http://localhost:8080/app | ftp://example.com/file |
| IP地址 | 83 | 255.255.255.255 | 192.168.001.1 |
| 身份证号 | 75 | 18 个字符的一串 | 17 个字符的一串 |
| 数字 | 15 | 3.14 与 -3.14 | 全角的 123 |
| 英文单词 | 9 | hello world 出 2 项 | 纯中文一行 0 项 |
手机号档:够 11 位就收,不看它从哪来
联系电话13812345678请查收 里号码紧挨中文、前后没分隔符,照样命中 1 条;反过来,首屏那份 18 位串的中段就截出过 19900101123,+8613800138000 命中的是后 11 位、前缀留在结果外。断链的是分隔符——138-0013-8000 与 138 0013 8000 都 0 命中,11 个全角数字也 0 命中。
图 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 毫秒。这两个值都不含浏览器解析与重绘,浏览器端耗时这轮没测。
图 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 个区间。重复怎么按业务口径收,可看 批量提取信息 那篇的记录。