正则表达式:
^(1[01]{3}|01[01]{2}|001[01]|0001)$
将起作用并且不依赖于前瞻或后瞻操作,这些操作不一定在所有正则表达式实现中都可用。虽然,现在问题已被编辑以提供将使用的语言:PHP 和 JavaScript 正则表达式都否定了前瞻。在这些语言中,正则表达式 ^(?!0000)[01]{4}$ 将起作用。
此答案顶部的正则表达式使用多个术语来构建连续更明确的匹配,因为每个字符位置都被指定。关键是匹配的四个字符串中必须至少有一个1 字符。一旦在字符串中遇到1 字符,我们就不关心剩下的字符是什么,除了[01]。
第一个词 1[01]{3} 将匹配以 1 开头的任意四个 0 和 1 数字。这涵盖了所有需要的匹配字符串,其中第一个数字是1,只留下尚未定义为匹配的以0 开头的所需字符串。
第二个词01[01]{2} 将匹配以01 开头的任意四个0 和1 数字。这只会留下以 00 开头的所需字符串,但尚未定义为匹配。
第三个词 001[01]{2} 将匹配 0010 和 0011
第四个词 0001 匹配一个与其他词不匹配的所需字符串。
验证一个 N 字符长的非零二进制字符串:
使用正则表达式比较和长度检查:
您的 cmets 表明您有更长的(例如 40 个字符)类似的字符串,您需要在其他情况下匹配这些字符串。
鉴于您需要检查各种不同长度的字符串,您最好创建一个能够测试多个不同长度的函数。
在 JavaScript 中,一种可能性是:
function isNonZeroBinaryStringOfLengthN(str, len) {
//True if string is all 0 or 1 with at least one 1 and is the right length.
return (str.length == len && /^[01]*1[01]*$/.test(str) );
}
只使用内置函数将字符串解析为整数并不是一个好主意:
对于这种情况,您最好还是坚持使用基于正则表达式的解决方案,而不是使用 PHP intval($str,2) 或 JavaScript parseInt(str,2)。原因是这两个函数都没有正确验证字符串。
在 PHP 中的命令:
echo intval('011134011',2);
打印
7
在 JavaScript 中的命令:
console.log(parseInt("0101382730101",2));
打印:
5
这意味着如果您使用其中一个内部字符串->int 解析函数,您仍然必须单独验证您传递给任一函数的字符串以匹配^[01]{n}$。鉴于无论如何您都必须这样做,您最好使用上面提到的单个正则表达式和长度测试而不将字符串解析为 int。