问题涉及为二进制字符串编写正则表达式。
您如何编写一个以 00 结尾的代码,以及另一个包含至少三个 1 的代码?
结尾00
:
^[01]*00$
至少包含三个1
:
^(?=.*(?:0*1){3})[01]*$
两个都:
^(?=.*(?:0*1){3})[01]*00$
解释:
^ # Start of string
(?= # Assert that the following could be matched here:
.* # Any number of characters
(?:0*1) # followed by any number of 0s and exactly one 1
{3} # three times
) # End of lookahead
[01]* # Match any number of ones or zeroes
00 # Match two zeroes
$ # at the end of the string
由于字符串可能只包含 1 和 0,因此我们实际上不需要前瞻。以下内容也将起作用(但仅在这些确切情况下):
^(?:0*1){3}[01]*00$
不使用正则表达式的替代解决方案:
private static final BigInteger FOUR = new BigInteger("4");
public boolean binaryStringIsOK(final String input)
{
final BigInteger b;
try {
b = new BigInteger(inputString, 2);
return b.mod(FOUR).equals(BigInteger.ZERO)
&& b.bitCount() >= 3;
} catch (NumberException ignored) {
return false;
}
}
“以 00 结尾”条件表示以 10 为底,是 4 的倍数;因此整数除以 4 的余数为 0。剩下的由.bitCount()
函数完成。
“以 00 结尾”的替代方法是测试该数字是否为逻辑数字 3 是否为 0:
// THREE = new BigInteger("3")
b.and(THREE).equals(BigInteger.ZERO)
这是检查正则表达式...
以 00 结尾
00$
三个 1
(10*){3}
对于全场比赛
^[01]*00$
^0*(10*){3}[01]*$