求助:匹配无连续相同位二进制数的正则表达式修正
解决无连续相同位二进制数的正则匹配问题
你的原正则表达式(01*01)*存在两个核心问题,导致合法字符串也无法匹配:
- 强制以
0开头,完全无法匹配以1开头的合法交替二进制数(比如你的测试用例"10101010"); 1*允许连续的1,这直接违反了"无连续相同位"的规则,同时还漏掉了单个0/1、奇数长度的合法字符串等场景。
正确的正则表达式
使用以下正则可以准确匹配所有无连续相同位的二进制数:
^(01|10)*[01]?$
如果不需要匹配空字符串,可使用更严谨的版本:
^(01|10)*[01]$|^(01|10)+$
正则说明:
^和$:锁定字符串的开头和结尾,确保整个字符串都符合规则,避免部分匹配;(01|10)*:匹配任意次数的"01"或"10"交替组合,覆盖偶数长度的合法字符串(如"01"、"1010");[01]?:允许字符串以单个0或1结尾,覆盖奇数长度的合法字符串(如"0"、"101"),?表示该部分可选。
修改后的Java代码
public static boolean isBin2(String bin2) { Pattern regexBinary2 = Pattern.compile("^(01|10)*[01]?$"); Matcher matcher = regexBinary2.matcher(bin2); return matcher.matches(); }
测试验证
- "10101010" → 返回
true(符合要求) - "10010101" → 返回
false(存在连续的0,不符合要求) - 边界测试:"0"、"1"、"01"、"101"均返回
true;"00"、"111"、"0110"均返回false
内容的提问来源于stack exchange,提问作者haruka kudo
相关产品推荐
相关产品推荐

