Pattern.matcher()匹配异常:如何编写匹配首尾为1中间仅含0的正则?
匹配首尾为1、中间仅含0的子串的解决方法
正确的正则与代码实现
要拿到所有符合要求(首尾是1,中间只有0,也可以没有0)的子串,包括重叠的情况,得用正向预查来做——它不会消耗字符串里的字符,能让我们遍历到每个可能的起始位置:
Pattern p = Pattern.compile("(?=(10*1))"); Matcher m = p.matcher(binaryString); while(m.find()){ System.out.println(m.group(1)); }
拿输入1101测试,会输出:
11 101
原代码失效的原因
你写的(10*1)正则本身的规则是对的,但Java的匹配机制导致它抓不全结果:
- 匹配会消耗字符,漏过重叠子串
Matcher.find()每次找到匹配后,会从匹配结束的位置继续往下找。比如输入1101,第一次抓到11(索引0到1)后,指针直接跳到索引2,剩下的01不符合开头是1的要求,自然抓不到后面的101。 - 无法覆盖重叠场景
你要的101和11是重叠的(共享中间的那个1),原代码的匹配方式会“用掉”前面的字符,根本没机会检查到这种重叠的情况。
内容的提问来源于stack exchange,提问作者Hua Liang
相关产品推荐
相关产品推荐

