如何用正则表达式正确识别二进制字符串中1之间的最长连续0序列?
解决二进制字符串中1之间最长连续0序列的正则方案
问题根源
你之前使用的1[0]+1和(10*)1存在一个关键缺陷:匹配时会消耗掉末尾的1,导致后续匹配无法复用这个1作为下一个0序列的开头标记。比如处理二进制10010001时,第一个匹配1001后,剩余字符串为0001,没有开头的1可供匹配,自然漏掉了000这个更长的目标序列。
正确正则表达式
使用零宽断言匹配前后被1包裹的0序列,这种方式不会消耗任何字符,所有符合条件的0序列都能被完整捕获:
(?<=1)0+(?=1)
(?<=1):正向后顾断言,确保0序列的前一位是10+:匹配一段连续的1个或多个0(?=1):正向前瞻断言,确保0序列的后一位是1
验证场景
- 数字7(二进制
111):无匹配结果,最长0序列长度为0 - 数字5(二进制
101):匹配到0,最长长度为1 - 数字10(二进制
1010):匹配到0,最长长度为1 - 数字145(二进制
10010001):匹配到00和000,最长长度为3
落地步骤
- 将目标数字转为纯二进制字符串(注意去除语言自带的前缀,比如Python中
bin(145)返回0b10010001,需截取[2:]部分) - 用上述正则匹配所有符合条件的0序列
- 遍历匹配结果,计算每个序列的长度并取最大值;若无匹配结果则返回0
内容的提问来源于stack exchange,提问作者Saurabh Kumar Singh
相关产品推荐
相关产品推荐

