匹配首个非零数字(含10、50等)的正则表达式需求
匹配首个非零数字的正则表达式解决方案
问题描述
需要编写正则表达式,匹配以分号分隔的字符串中首个非零数字段,且必须包含10、20、50这类以0结尾的数字。之前尝试的正则\d+[^0](?=;)会排除这类数字,无法满足需求。
正确正则表达式
(?:^|;)0*(?!0)(\d+)(?=;)
正则解释
(?:^|;):匹配字符串开头或分号,定位到数字段的起始位置,避免从数字中间匹配0*:跳过数字段开头的所有0(?!0):负向预查,确保接下来的字符不是0,保证找到的是首个非零开头的数字段(\d+):捕获完整的数字段,这就是我们需要的结果(?=;):正向预查,确保数字段后面跟着分号,保证匹配的是完整的数字项
示例验证
| value | 正则匹配结果 |
|---|---|
| 0;0;0;0;0;0;0;0;0;0;51;0;0;0;0;0;0;0;0;0;0;51;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 | 51 |
| 0;0;0;0;0;0;0;0;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0 | 50 |
| 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;100;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;123;0;0;0;0;0;0;0 | 100 |
原正则问题分析
\d+[^0](?=;)的问题在于[^0]要求数字的最后一位必须是非0字符,直接排除了10、50这类以0结尾的数字。同时它没有定位到数字段的起始位置,可能出现从长数字中间匹配的情况,完全不符合需求。
内容的提问来源于stack exchange,提问作者Maria B.
相关产品推荐
相关产品推荐

