我有一个字符串Eg 1001
,它需要正好是4个字符,可以是0
和1
的任意组合,但不是全部为零(所有都可以)。
我想到了:
^[01]{4}$
无效,因为它接受0000
我将使用PHP或JavaScript来执行此操作。
只需添加细节。
我将使用它来验证多重选择问卷的答案,然后再进入数据库,因此字符串的长度为N,具体取决于问题的选择数量。
所以提供一般解决方案的功能会很棒。
答案 0 :(得分:5)
应该有效
^(?!0000)[01]{4}$
注意:使用gm
作为修饰符
详细了解实际匹配字符的Lookahead and Lookbehind Zero-Length Assertions,然后放弃匹配,只返回结果:匹配或不匹配。
模式说明:
^ the beginning of the string
(?! look ahead to see if there is not:
0000 '0000'
) end of look-ahead
[01]{4} any character of: '0', '1' (4 times)
$ end of the string
答案 1 :(得分:0)
正则表达式:
^(1[01]{3}|01[01]{2}|001[01]|0001)$
可以工作并且不依赖于所有正则表达式实现中不一定可用的预见或后视操作。虽然现在已经编辑了问题以提供将要使用的语言:PHP和JavaScript正则表达式都否定了前瞻。在这些语言中,正则表达式^(?!0000)[01]{4}$
将起作用。
此答案顶部的正则表达式使用多个术语在指定每个字符位置时连续构建更多显式匹配。关键是匹配的四个字符串中必须至少有一个1
个字符。一旦在字符串中遇到1
字符,除了[01]
之外,我们不关心剩下的字符是什么。
第一个词1[01]{3}
将匹配以0
开头的任意四个1
和1
数字。这涵盖了所有所需的匹配字符串,其中第一个数字是1
,只留下以0
开头但尚未定义为匹配的所需字符串。
第二个词01[01]{2}
将匹配以0
开头的任意四个1
和01
数字。这样只留下以00
开头但尚未定义为匹配的所需字符串。
第三个词001[01]{2}
将匹配0010
和0011
第四个术语0001
匹配与其他术语不匹配的所需字符串。
使用正则表达式比较和长度检查:
您的评论表明您有更长的(例如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
这意味着如果您使用其中一个内部string-> int解析函数,您仍然需要单独验证要传递给任一函数的字符串以匹配^[01]{n}$
。无论如何你必须这样做,你最好不要使用上面提到的单一正则表达式和长度测试而不将字符串解析为int。
答案 2 :(得分:0)
另一个简单的解决方案是:
^[01]{4}(?<=100|10|1)$
根据您的两个可能值[0,1],您只有8种不同的可能性:
0000 0001 0010 0011 0100 0101 0110 0111 1111
您的原始正则表达式会击中所有这些值。但是,积极的后置代码可确保代码以#1; 10,&#39; 10&#39;或者&#39; 100&#39;。这涵盖了除0000之外的所有可能值。