正则表达式匹配疑问:为何匹配5位数字?如何限定em/rem格式
问题原因
原正则\d{0,2}\.?\d{0,3}r?em出现匹配异常的核心原因有两个:
- 缺少边界锚定:没有用
^和$限定匹配的起始与结束位置,导致正则会从12123rem这类字符串中截取符合片段的部分完成匹配(比如拆分12123为12+123,再拼接rem),而非要求整个字符串完全符合规则。 - 数字结构逻辑松散:
\d{0,2}和\d{0,3}是独立的数字匹配规则,既允许无整数直接写小数(如.123em),也允许连续整数被拆分匹配,出现超过2位的整数部分被误判的情况。
修正后的正则
根据你需要匹配的格式,修正后的正则为:
^\d{1,2}(?:\.\d{1,3})? ?r?em$
正则规则解释
^:匹配字符串开头,确保从最开始校验格式\d{1,2}:匹配1-2位整数部分(避免空整数的非法格式,比如.123em)(?:\.\d{1,3})?:可选的小数部分,?:表示非捕获组,\.匹配小数点,\d{1,3}匹配1-3位小数,?表示该部分可省略?:匹配整数/小数与单位之间可选的单个空格(兼容12 rem这类带空格的格式)r?em:匹配em或rem两种单位$:匹配字符串结尾,确保整个字符串完全符合规则
验证效果
该正则会正确匹配以下格式:
12em12 rem12.345em12.345rem
同时拒绝以下非法格式:
12123rem(整数部分超过2位).123em(无整数部分)12.3456em(小数部分超过3位)12remx(结尾存在多余字符)
内容的提问来源于stack exchange,提问作者Sushmit Sagar
相关产品推荐
相关产品推荐

