正则找到数字就算验证通过?用整串边界与多行标志复算
正则测试工具
点击使用相关工具
把abc123粘到正则测试工具,表达式填[0-9]+,结果找到了123,位置是3。这个结果只能说明文本里有一段数字。如果你要检查的是“整个编号只能包含数字”,前面的abc已经让它不合格,不能拿“匹配数大于0”当作通过条件。
先用两条输入分清任务
页面把表达式和标志分成两个输入框,两边的斜杠已由界面显示。表达式框直接写^[0-9]+$,不要把/^[0-9]+$/g整段粘进去;右侧标志框先清空。测试文本一次只放一条编号,输入后结果会自动更新。
| 测试文本 | [0-9]+ | ^[0-9]+$,标志留空 |
|---|---|---|
| abc123 | 找到123,位置3 | 0个匹配 |
| 00123 | 找到00123,位置0 | 找到完整00123,位置0 |
| 空格后接123 | 找到123,位置1 | 0个匹配 |
[0-9]只允许ASCII数字,+要求至少一个;没有多行标志时,^和$限定输入的开头与结尾。第二列适合从说明文字里提取数字片段,第三列才对应此处的整串格式检查。前导零也会保留,工具不会把00123转换成数值123。全角数字123、小数点、负号、空格都不在这条规则的允许范围里。
首尾空白要不要清除是业务决定。若编号导入规则允许清理,可先在文本处理工作流逐行去除两端空格,再核对结果;若规则要求原样检查,就保留空白并让它不通过。不能为了得到符合预期的结果,悄悄删掉有意义的字符。
四行编号:g不会让边界自动变成逐行
把下面四行整体放进测试文本,表达式改成^A\d{2}$。这里的反斜杠只输入一个,表示A后面恰好两位数字。
A01 XA02 A03 A004
右侧填g时是0个匹配:整段输入既不是单独的A01,也不是单独的A03。改为gm后得到2个匹配,分别是位置0的A01和位置9的A03。XA02前面多了X,A004多了一位数字,两行都不会被完整选中。再把标志改成只有m,结果只显示第一处A01,共1个。
这组差别来自两个独立开关:m让首尾断言也能落在各行边界;g让本页继续查找后续匹配。于是“逐行找全部合格编号”需要gm,“检查一条完整编号”通常先用空标志。若拿gm下的2个命中推断整批四行全合格,仍然会放过两条错误记录。
没有结果时,先看输入,再看错误
表达式或测试文本为空时,本页会清空结果区,并不显示一次有效的0匹配测试。要验证空字符串能否通过某项业务规则,不能只看这个空白面板;本例的加号本来就要求至少一个数字。表达式填成单独的[时,会出现正则表达式错误,表示语法没有成立,不能把它记录成“校验失败0条”。
工具使用浏览器JavaScript的正则规则。其他语言、数据库或服务器框架的写法与标志可能不同,迁入生产校验代码前还要在目标环境验证。也不要把常用正则按钮的命中当作手机号可联系、身份证真实有效或日期确实存在的证明;格式只是其中一层。使用自己生成的小样本即可,避免粘贴客户名单或凭据;复杂嵌套重复可能让浏览器长时间无响应,不宜用大段真实数据试探性能。
为什么不直接勾“全部替换”?
这页负责展示匹配,并不替换原文本。需要把已确认的片段改写,再去文本替换;替换范围、普通文本与正则模式的选择是下一步任务,不能用替换成功反过来证明原输入合格。
结果位置从几开始?
从0开始,所以abc123里的1在位置3。这里的示例都是ASCII;遇到表情等字符,位置采用JavaScript字符串的UTF-16码元计数,不一定等于肉眼数出的字符数量。核对业务编号时,除了匹配次数,还应核对每次命中的完整值和被排除的行。